【发布时间】:2013-03-07 00:49:15
【问题描述】:
我在一个旨在格式化我拥有的一些文件的程序中调用File.ReadAllText()。
其中一些文件包含® (174) 符号。但是,在读取文本时,返回的字符串包含 � (65533) 符号,而 ® (174) 应该是。
这是什么原因造成的,我该如何解决?
【问题讨论】:
标签: c# text character-encoding special-characters symbols
我在一个旨在格式化我拥有的一些文件的程序中调用File.ReadAllText()。
其中一些文件包含® (174) 符号。但是,在读取文本时,返回的字符串包含 � (65533) 符号,而 ® (174) 应该是。
这是什么原因造成的,我该如何解决?
【问题讨论】:
标签: c# text character-encoding special-characters symbols
这可能是由于Encoding 不匹配造成的。使用 ReadAllText 重载允许您指定正确的 Encoding 在读取文件时使用。
默认重载将采用 UTF-8,除非它可以检测到 UTF-32。任何其他编码都会错误地通过。
【讨论】:
Encoding.Default 使用系统的所谓当前ANSI 代码页,该代码页因系统而异。使用 UTF-8 可以避免在具有不同当前 ANSI 代码页的系统上进行编码和解码时产生的编码错误。此外 UTF-8 可以编码所有的 UNICODE。
该文件很可能包含与默认编码不同的编码。如果您知道,可以使用 File.ReadAllText Method (String, Encoding) 覆盖指定它。
代码示例:
string readText = File.ReadAllText(path, Encoding.Default); // <-- change the encoding to whatever the encoding really is
如果您不知道编码,请参阅之前的 SO 问题:How to use ReadAllText when file encoding unknown
【讨论】:
您需要在调用File.ReadAllText 时指定编码,除非文件实际上是UTF-8,听起来好像不是。 (基本上单参数重载相当于传入 UTF-8 作为第二个参数。我相信它还会检测带有适当字节顺序标记的 UTF-32。)
第一件事是找出它 的编码方式(例如 ISO-8859-1 - 但您需要 检查 这个),然后将其作为第二个参数。
例如:
Encoding isoLatin1 = Encoding.GetEncoding(28591);
string text = File.ReadAllText(path, isoLatin1);
在尝试将二进制数据读取为文本之前,始终了解二进制数据的编码方式非常重要。文件、网络流等任何东西都是如此。
【讨论】:
您正在阅读的字符是替换字符
用于替换值未知或在 Unicode 中无法表示的传入字符 比较使用U+001A作为控制字符来表示替代函数
http://www.fileformat.info/info/unicode/char/fffd/index.htm
你得到这个是因为文件的实际编码与你的程序期望的编码不匹配。
默认情况下,ReadAllText 需要 UTF-8。它遇到一个不代表有效 UTF-8 字符的字节序列,所以用 替换字符 替换它。
【讨论】: