Преамбула пуста для (new Utf8Encoding ()). GetPreamble () - странно - PullRequest
1 голос
/ 08 января 2010

Может ли кто-нибудь объяснить разницу между вызовом GetPreamble () для недавно созданной кодировки utf8 по сравнению с общедоступными, доступными в классе Encoding?

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

p1 - обычная 3-байтовая преамбула utf-8, но p2 оказывается пустым, что выглядит очень неправильно.

Ответы [ 2 ]

8 голосов
/ 08 января 2010

Разница в том, что свойство Enconding UTF8 создается таким образом

new UTF8Encoding(true)

это означает, что encoderShouldEmitUTF8Identifier = true, поэтому преамбула с 3 байтами есть

и ваш вызов конструктора по умолчанию

new UTF8Encoding() 

, что эквивалентно

new UTF8Encoding(false)

Чтобы получить те же результаты:

byte[] p1 = Encoding.UTF8.GetPreamble();
byte[] p2 = new UTF8Encoding(true).GetPreamble();
2 голосов
/ 08 января 2010

Итак, мой код, который получает все известные преамбулы, теперь выглядит так:

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

Таким образом, я могу написать код, который безопасно преобразует байтовый массив с необязательной преамбулой в строку, просто предоставив кодировщик по умолчанию для тех, у которых нет преамбулы. Yay

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...