Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# (新的Utf8Encoding())的序言为空。GetPreamble()-奇怪_C#_.net_Encoding_Utf 8 - Fatal编程技术网

C# (新的Utf8Encoding())的序言为空。GetPreamble()-奇怪

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

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

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根本不支持它。