我有一个包含内容" test"的文本文件(UTF-8编码)。我尝试从这个文件中获取字节数组并转换为字符串,但它包含一个奇怪的字符。我使用以下代码:
var path = @"C:\Users\Tester\Desktop\test\test.txt"; // UTF-8
var bytes = File.ReadAllBytes(path);
var contents1 = Encoding.UTF8.GetString(bytes);
var contents2 = File.ReadAllText(path);
Console.WriteLine(contents1); // result is "?test"
Console.WriteLine(contents2); // result is "test"
conents1
与contents2
不同 - 为什么?
答案 0 :(得分:5)
如ReadAllText
's documentation中所述:
此方法尝试根据字节顺序标记的存在自动检测文件的编码。可以检测到编码格式UTF-8和UTF-32(big-endian和little-endian)。
因此该文件包含BOM(Byte order mark),ReadAllText
方法正确解释它,而第一种方法只读取普通字节,而根本不解释它们。
将指定字节数组中的所有字节解码为字符串
(强调我的)。这当然不是完全确定的,但是你的例子表明这是字面意思。
答案 1 :(得分:4)
您可能会在文件开头看到Unicode BOM(字节顺序标记)。 File.ReadAllText
知道如何删除它,但Encoding.UTF8
没有。
答案 2 :(得分:1)
它是UTF8编码前缀字符串。它将文件标记为UTF8编码。 ReadAllText
不会返回它,因为它是一个解析指令。