有人可以解释在新实例化的utf8编码上调用GetPreamble()与编码类中可用的公共编码之间的区别吗?
byte[] p1 = Encoding.UTF8.GetPreamble();
byte[] p2 = new UTF8Encoding().GetPreamble();
p1是正常的3字节utf-8前导码,但p2最终为空,这似乎非常错误。
答案 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
这样我就可以编写代码,只需为没有前导码的字符串提供默认编码器,就可以安全地将带有可选前导码的字节数组转换为字符串。耶