该片段说明了一切: - )
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?
答案 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这样的东西。