(新的Utf8Encoding())的序言是空的.GetPreamble() - 很奇怪

时间:2010-01-08 13:08:33

标签: c# .net encoding utf-8

有人可以解释在新实例化的utf8编码上调用GetPreamble()与编码类中可用的公共编码之间的区别吗?

byte[] p1 = Encoding.UTF8.GetPreamble();
byte[] p2 = new UTF8Encoding().GetPreamble();

p1是正常的3字节utf-8前导码,但p2最终为空,这似乎非常错误。

2 个答案:

答案 0 :(得分:8)

区别在于Enconding的UTF8属性是以这种方式创建的

new UTF8Encoding(true)

这表明encoderShouldEmitUTF8Identifier = true所以3字节前导码就在那里

并调用默认构造函数

new UTF8Encoding() 

相当于

new UTF8Encoding(false)

获得相同的结果:

byte[] p1 = Encoding.UTF8.GetPreamble();
byte[] p2 = new UTF8Encoding(true).GetPreamble();

答案 1 :(得分:2)

所以我的代码知道前导码现在看起来像这样:

var preambles = new Dictionary<string, byte[]>();
foreach (var encodingInfo in Encoding.GetEncodings()) {
    Encoding encoding = Encoding.GetEncoding(encodingInfo.Name);
    var preamble = encoding.GetPreamble();
    if (preamble != null && preamble.Length > 0)
        preambles.Add(encodingInfo.Name, preamble);
}

原来不是很多人

utf-16      [2] 255 254
unicodeFFFE [2] 254 255
utf-32      [4] 255 254 0 0
utf-32BE    [4] 0 0 254 255
utf-8       [3] 239 187 191

这样我就可以编写代码,只需为没有前导码的字符串提供默认编码器,就可以安全地将带有可选前导码的字节数组转换为字符串。耶