我在一个旨在格式化我拥有的某些文件的程序中调用File.ReadAllText()
。
其中一些文件包含®
(174)符号。但是,在读取文本时,返回的字符串包含�
(65533)符号,其中®
(174)应该是。
导致此问题的原因以及如何解决?
答案 0 :(得分:13)
这可能是由于Encoding
不匹配造成的。使用ReadAllText重载,您可以指定在阅读文件时使用的正确Encoding
。
默认重载将采用UTF-8,除非它可以检测到UTF-32。任何其他编码都会错误地发生。
答案 1 :(得分:10)
文件最有可能包含与默认编码不同的编码。如果您知道,可以使用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
答案 2 :(得分:7)
您需要在调用File.ReadAllText
时指定编码,除非该文件实际上是UTF-8,听起来并非如此。 (基本上,单参数重载相当于传入UTF-8作为第二个参数。我相信它还会检测带有适当字节顺序标记的UTF-32。)
首先要弄清楚是的编码方式(例如ISO-8859-1 - 但你需要检查这个),然后将其作为第二个论点。
例如:
Encoding isoLatin1 = Encoding.GetEncoding(28591);
string text = File.ReadAllText(path, isoLatin1);
总是重要的是,在尝试将二进制数据作为文本读取之前,您知道二进制数据的编码使用了什么。对于文件,网络流,任何东西都是如此。
答案 3 :(得分:0)
您正在阅读的角色是替换角色
用于替换Unicode中未知或不可表示的值的传入字符 比较使用U + 001A作为控制字符来表示替代函数
http://www.fileformat.info/info/unicode/char/fffd/index.htm
您得到的是因为文件的实际编码与程序所期望的编码不匹配。
默认情况下,ReadAllText需要UTF-8。它遇到的字节序列不代表有效的UTF-8字符,因此将其替换为替换字符。