File.ReadAllText中的字符无效
我正在一个程序中调用File.ReadAllText()
,该程序旨在格式化我拥有的一些文件。
其中一些文件包含®
(174)符号。 但是,在读取文本时,返回的字符串包含
(65533)符号,其中®
(174)应该是。
是什么导致这种情况,我该如何解决?
这可能是由于Encoding
不匹配造成的。 使用ReadAllText重载,它允许您指定在读取文件时使用的正确Encoding
。
除非可以检测到UTF-32,否则默认重载将采用UTF-8。 任何其他编码都将错误地发生。
该文件很可能包含与默认编码不同的编码。 如果您知道,可以使用File.ReadAllText方法(字符串,编码)覆盖来指定它。
代码示例:
string readText = File.ReadAllText(path, Encoding.Default); // <-- change the encoding to whatever the encoding really is
如果您不知道编码,请参阅此前的SO问题: 如何在文件编码未知时使用ReadAllText
调用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字符,因此将其替换为Replacement字符 。