【问题标题】:An issue with apostrophes when writing to a text file写入文本文件时出现撇号问题
【发布时间】:2014-01-28 13:13:52
【问题描述】:

我正在从 SQL Server 数据库中提取一些数据并将其写入文本文件,并且在大多数情况下,该过程按预期工作。有一个问题我一直无法解决。撇号显示为:’

这是写入文件的代码:

using (var writer = new StreamWriter(filePath, false))
{
    foreach (var textLine in dataList)
    {
        writer.WriteLine(textLine);
    }
}

我尝试在文本上使用Encoding.DefaultEncoding.Utf8,但这并没有什么不同。

我在 Notepad、Notepad++ 和 UltraEdit 中打开文件。

谁能帮我找出这个问题?

【问题讨论】:

  • 这是人的文化,要么坚持,要么拔出
  • @ARM 一个深刻的、甚至是开创性的洞察力。

标签: c#


【解决方案1】:

您确定要存储真正的撇号(字符代码 39)而不是智能引号字符之一吗? https://en.wikipedia.org/wiki/Quotation_mark_glyphs

【讨论】:

  • 我不是。写入文件的文本可以通过多种方式输入(键入、复制/粘贴等)。在某些情况下,撇号显示得很好,而在其他情况下,我得到了上面问题中显示的字符。
  • 如果有人在复制粘贴,尤其是从 Word 中复制粘贴,那么他们很可能粘贴的是智能引用。如有必要,您可能需要预处理输入以转换它们。或者只是接受您可能需要存储宽字符的事实。
  • @RonS 看起来你得到了卷曲撇号:stackoverflow.com/a/2477480/424129
  • @EdPlunkett 我是。我拿出了具体的说明来确认。这是我可以在将其写入文件之前修复的问题吗?
  • @RonS 简单而丑陋的方法是在编写文本之前用 7 位 ASCII 直撇号替换左右弯撇号。我也会对花引号做同样的事情。另一种方法是使用调试器准确确定您从数据库中获得的内容(可能是 UTF16 吗?),并确保您正在写入文本文件,并在开头使用正确的字节顺序标记文本文件。可以想象,您可能正在获取 UTF-8 数据,但字符串类可能认为它是 ANSI?
【解决方案2】:

’ 是字符 的 UTF-8 字节流,在 Windows 1252 代码页中显示为 ANSI 字符。

UltraEdit 在打开时检测创建的​​文本文件以 UTF-8 编码并正确显示应该没有问题。

请参阅我在bad character encoding after xsl 1.0 transform 的回答,详细了解如何在 UltraEdit 中自动检测 UTF-8 编码,以及如果在配置中未启用自动检测(高级 - 配置 - 文件处理 - Unicode/UTF-8 检测)或当第一个 UTF-8 字符不在前 64 KB 内时失败。

您可以帮助文本编辑器检测文件的 UTF-8 编码,方法是先将 3 个字节 0xEF 0xBB 0xBF 写入文件,以 ANSI 字符串显示为,然后再将数据列表的行写入文本文件。 0xEF 0xBB 0xBF 是以 UTF-8 编码的文件的字节顺序标记 (BOM),文本编辑器可以识别,但不显示。

字符 也可在代码页 Windows 1252(十六进制值 0x92)中使用,因此也可以通过从 UTF-8 到 ANSI 的转换存储在文本文件中。但是数据列表也可能包含系统代码页中不可用的 Unicode 表中的字符,因此最好将文件创建为 UTF-8 编码的文本文件而不是 ANSI 文本文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2016-08-22
    相关资源
    最近更新 更多