StreamWriter和Encoding.UTF8.GetBytes产生不同的结果

时间:2018-01-18 12:55:25

标签: c# utf-8

为什么使用StreamWriterUTF8.GetBytes将字符串编码为byte []会产生不同的结果?:

string value = "myTestValue";

byte[] data = Encoding.UTF8.GetBytes(value);
byte[] streamedData;
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8))
{
    streamWriter.Write(value);
    streamWriter.Flush();
    streamedData = memoryStream.ToArray();
}

//false
data.SequenceEqual(streamedData);

1 个答案:

答案 0 :(得分:1)

所有关于BOM以及实施Encoding.GetBytes()的方式。

静态对象Encoding.UTF8已初始化为包含BOM,您可以在

中看到
Encoding.UTF8.GetPreamble();

因此,StreamWriter将其正确地写入给定的Stream对象(使用BOM)。但是Encoding.GetBytes()永远不会发出BOM;即使你构造UTF8Encoding对象来执行此操作:

byte[] withoutBom = new UTF8Encoding(false).GetBytes(value);
byte[] withBom = new UTF8Encoding(true).GetBytes(value);

// true
withoutBom.SequenceEqual(withBom);

如果您希望StreamWriter在没有BOM的情况下进行编码,您可以将其初始化为:

new StreamWriter(stream, new UTF8Encoding(false)

这样两个二进制文件都是相同的。