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字符