Csharp/C#教程:为什么File.ReadAllBytes与使用File.ReadAllText时的结果不同?分享


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

我有一个内容为“test”的文本文件(UTF-8编码)。 我尝试从这个文件中获取字节数组并转换为字符串,但它包含一个奇怪的字符。 我使用以下代码:

var path = @"C:UsersTesterDesktoptesttest.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" 

conents1contents2不同 – 为什么?

正如ReadAllText的文档中所述 :

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

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

Encoding.GetString只说它:

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

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

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

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

上述就是C#学习教程:为什么File.ReadAllBytes与使用File.ReadAllText时的结果不同?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/959339.html

(0)
上一篇 2021年11月23日
下一篇 2021年11月23日

精彩推荐