为什么不从UTF8Encoding.GetBytes发出字节顺序标记?

时间:2009-01-07 16:00:22

标签: c# .net unicode encoding utf-8

该片段说明了一切: - )

UTF8Encoding enc = new UTF8Encoding(true/*include Byte Order Mark*/);
byte[] data = enc.GetBytes("a");
// data has length 1.
// I expected the BOM to be included. What's up?

4 个答案:

答案 0 :(得分:18)

你不希望它被用于每次调用GetBytes,否则你无法(比方说)一次写一行文件。

通过用GetPreamble公开它,呼叫者可以在适当的位置(即在他们的数据开始时)插入前导码。我同意文件可以更加清晰。

答案 1 :(得分:8)

谢谢你们俩。以下工作,LINQ使组合简单: - )

UTF8Encoding enc = new UTF8Encoding(true);
byte[] data = enc.GetBytes("a");
byte[] combo = enc.GetPreamble().Concat(data).ToArray();

答案 2 :(得分:3)

因为预计GetBytes()会被多次调用...你需要使用:

byte[] preamble = enc.GetPreamble();

(仅在序列的开头调用它)并写出; 是BOM的所在地。

答案 3 :(得分:2)

请注意,一般情况下,无论如何都不需要UTF-8的字节顺序标记。它的主要目的是告诉UTF16 BE和UTF16 LE。没有UTF8 LE和UTF8 BE这样的东西。