C# (新的Utf8Encoding())的序言为空。GetPreamble()-奇怪
有人能解释在新实例化的utf8编码上调用getPremission()与在encoding类中调用公共编码之间的区别吗C# (新的Utf8Encoding())的序言为空。GetPreamble()-奇怪,c#,.net,encoding,utf-8,C#,.net,Encoding,Utf 8,有人能解释在新实例化的utf8编码上调用getPremission()与在encoding类中调用公共编码之间的区别吗 byte[] p1 = Encoding.UTF8.GetPreamble(); byte[] p2 = new UTF8Encoding().GetPreamble(); p1是正常的3字节utf-8前导,但p2最终为空,这似乎是非常错误的。不同之处在于编码的UTF8属性是这样创建的 new UTF8Encoding(true) 这表示编码器houldemitutf8id
byte[] p1 = Encoding.UTF8.GetPreamble();
byte[] p2 = new UTF8Encoding().GetPreamble();
p1是正常的3字节utf-8前导,但p2最终为空,这似乎是非常错误的。不同之处在于编码的UTF8属性是这样创建的
new UTF8Encoding(true)
这表示编码器houldemitutf8identifier=true,因此有3字节的前导码
以及对默认构造函数的调用
new UTF8Encoding()
这相当于
new UTF8Encoding(false)
要获得相同的结果:
byte[] p1 = Encoding.UTF8.GetPreamble();
byte[] p2 = new UTF8Encoding(true).GetPreamble();
不同之处在于Enconding的UTF8属性是这样创建的
new UTF8Encoding(true)
这表示编码器houldemitutf8identifier=true,因此有3字节的前导码
以及对默认构造函数的调用
new UTF8Encoding()
这相当于
new UTF8Encoding(false)
要获得相同的结果:
byte[] p1 = Encoding.UTF8.GetPreamble();
byte[] p2 = new UTF8Encoding(true).GetPreamble();
因此,我的代码获得了所有已知的序言,现在如下所示:
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);
}
通过这种方式,我可以编写代码,只需为没有前导的字节数组提供默认编码器,就可以安全地将带有可选前导的字节数组转换为字符串。耶所以我的代码现在看起来像这样:
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);
}
通过这种方式,我可以编写代码,只需为没有前导的字节数组提供默认编码器,就可以安全地将带有可选前导的字节数组转换为字符串。耶Encoding.GetEncoding(“utf-8”).GetPreamble()工作正常。MarcosMeli回答了你的问题,是吗?你应该接受他的答案。Encoding.GetEncoding(“utf-8”)。getPremission()工作正常。MarcosMeli回答了你的问题,是吗?你应该接受他的回答。我不久前在这方面遇到了一些问题,很高兴这有帮助:)还要注意一些.NET类,如
System.IO.StreamWriter
,默认情况下实际上使用了新的UTF8Encoding(false,true)
。这与Encoding.UTF8
属性不同,从上面可以明显看出。Encoding.UTF8
没有使用默认构造函数是非常可笑的new UTF8Encoding()
…我不久前遇到了一些问题,很高兴它有帮助:)还请注意一些.NET类,像System.IO.StreamWriter
,默认情况下实际使用新的UTF8Encoding(false,true)
。这与Encoding.UTF8
属性不同,从上面可以明显看出。非常可笑的是Encoding.UTF8
没有使用默认构造函数new UTF8Encoding()
…奇怪的是,UTF-7显然有一个BOM,但是.net framework根本不支持它。奇怪的是,UTF-7显然有一个BOM表,而.net framework根本不支持它。