12
4

4 回答 4

14

这很可能是由于Encoding. 使用ReadAllText重载,它允许您Encoding在读取文件时指定要使用的正确值。

默认重载将采用 UTF-8,除非它可以检测到 UTF-32。任何其他编码都会错误地通过。

于 2013-03-18T15:47:16.300 回答
13

该文件很可能包含与默认编码不同的编码。如果您知道,可以使用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

于 2013-03-18T15:48:25.177 回答
12

您需要在调用 时指定编码File.ReadAllText,除非文件实际上是 UTF-8 格式,听起来好像不是。(基本上单参数重载相当于传入 UTF-8 作为第二个参数。我相信它还会检测带有适当字节顺序标记的 UTF-32。)

第一件事是确定它在哪个编码(例如 ISO-8859-1 - 但您需要检查这一点),然后将其作为第二个参数传递。

例如:

Encoding isoLatin1 = Encoding.GetEncoding(28591);
string text = File.ReadAllText(path, isoLatin1);

在尝试将二进制数据读取为文本之前,了解二进制数据的编码方式始终很重要。对于文件、网络流等任何东西都是如此。

于 2013-03-18T15:47:41.183 回答
0

您正在阅读的字符是替换字符

用于替换值未知或在 Unicode 中无法表示的传入字符比较使用 U+001A 作为控制字符来指示替换功能

http://www.fileformat.info/info/unicode/char/fffd/index.htm

你得到这个是因为文件的实际编码与你的程序期望的编码不匹配。

默认情况下,ReadAllText 需要 UTF-8。它遇到一个不代表有效 UTF-8 字符的字节序列,因此将其替换为Replacement character

于 2013-03-18T15:48:45.350 回答