UTF8编码没有添加字节顺序标记

3
我们知道,类UTF8Encoding的构造函数可以接收一个可选参数:一个bool,用于指定编码器是否应该提供字节顺序标记(BOM)。
然而,使用这两种方法编码相同的文本时,输出结果是相同的。
string text = "Hello, world!";
byte[] withBom= new UTF8Encoding(true).GetBytes(text);
byte[] withoutBom = new UTF8Encoding(false).GetBytes(text);

无论是 withBom 还是 withoutBom,它们都有相同的内容,其中一个字节也没有多。

为什么会这样?为什么字节顺序标记没有添加到 withBom 中?

2个回答

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

1
非常感谢!您知道为什么必须手动添加前导吗? - Matias Cicero
1
@MatiCicero GetBytes 可以用于部分输出,而不仅仅是整个字符串。每次生成 BOM 并不会有帮助。 - Athari
1
哈哈,这是我的荣幸! - Matias Cicero

3

BOM可以通过UTF8Encoding.GetPreamble方法返回:

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

+1 是指向我展示如何将其附加到当前编码字节的方式。 - Matias Cicero
@MatiCicero 我不建议在处理大字符串时使用这段代码。它会产生太多的垃圾。 - Athari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接