4 回答
这很可能是由于Encoding
. 使用ReadAllText重载,它允许您Encoding
在读取文件时指定要使用的正确值。
默认重载将采用 UTF-8,除非它可以检测到 UTF-32。任何其他编码都会错误地通过。
该文件很可能包含与默认编码不同的编码。如果您知道,可以使用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
您需要在调用 时指定编码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 character。