为什么File.ReadAllBytes与使用File.ReadAllText时的结果不同?

Dra*_*gon 9 c# string byte

我有一个内容为"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"
Run Code Online (Sandbox Code Playgroud)

conents1不同于contents2- 为什么?

Bar*_*zKP 5

ReadAllText文档中所述:

此方法尝试根据字节顺序标记的存在自动检测文件的编码.可以检测到编码格式UTF-8和UTF-32(big-endian和little-endian).

因此该文件包含BOM(字节顺序标记),并且ReadAllText方法正确解释它,而第一种方法只读取普通字节,而根本不解释它们.

Encoding.GetString 只说:

将指定字节数组中的所有字节解码为字符串

(强调我的).这当然不是完全确定的,但是你的例子表明这是从字面上理解的.


rec*_*ive 5

您可能会在文件开头看到 Unicode BOM(字节顺序标记)。 File.ReadAllText知道如何剥离它,但Encoding.UTF8不知道。


Phi*_*ipH 1

它是UTF8编码前缀字符串。它将文件标记为 UTF8 编码。ReadAllText不返回它,因为它是一个解析指令。