UTF8编码未添加字节顺序标记



我们知道类UTF8Encoding的构造函数可以接收一个可选参数:一个指定编码器是否应该提供字节顺序标记(BOM)的bool

然而,当使用两种方法对相同的文本进行编码时,输出是相同的:

string text = "Hello, world!";
byte[] withBom= new UTF8Encoding(true).GetBytes(text);
byte[] withoutBom = new UTF8Encoding(false).GetBytes(text);

withBomwithoutBom都有相同的内容,其中一个甚至没有比另一个多一个字节。

为什么会发生这种情况?为什么字节顺序标记没有添加到withBom

构造函数中的BOM参数不影响GetBytes的结果,它影响GetPreamble的结果。用户应手动附加它。
byte[] bom = new UTF8Encoding(true).GetPreamble(); // 3 bytes
byte[] noBom = new UTF8Encoding(false).GetPreamble(); // 0 bytes

BOM通过UTF8Encoding.GetPreamble方法返回:

UTF8Encoding enc = new UTF8Encoding(true);
byte[] withBom = enc.GetPreamble().Concat(enc.GetBytes(text)).ToArray();

相关内容

  • 没有找到相关文章

最新更新