File.ReadAllText中的字符无效

时间:2013-03-18 15:45:45

标签: c# text character-encoding special-characters symbols

我在一个旨在格式化我拥有的某些文件的程序中调用File.ReadAllText()

其中一些文件包含®(174)符号。但是,在读取文本时,返回的字符串包含(65533)符号,其中®(174)应该是。

导致此问题的原因以及如何解决?

4 个答案:

答案 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字符,因此将其替换为替换字符