构造函数中的BOM参数不影响
我们知道类UTF8Encoding
的构造函数可以接收一个可选参数:一个指定编码器是否应该提供字节顺序标记(BOM)的bool
。
然而,当使用两种方法对相同的文本进行编码时,输出是相同的:
string text = "Hello, world!";
byte[] withBom= new UTF8Encoding(true).GetBytes(text);
byte[] withoutBom = new UTF8Encoding(false).GetBytes(text);
withBom
和withoutBom
都有相同的内容,其中一个甚至没有比另一个多一个字节。
为什么会发生这种情况?为什么字节顺序标记没有添加到withBom
?
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();