Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

Ошибка в Encoding.Unicode

#c_sharp


Имею код:

byte[] one = new byte[] {215, 170, 8, 223, 101, 20, 107, 124};
byte[] two = Encoding.Unicode.GetBytes(Encoding.Unicode.GetString(one));
foreach (var el in two)
    Console.Write(el + " ");


На выходе:

215 170 253 255 101 20 107 124


Как видно, третий и четвёртый байты не совпадают. Баг или фича?
    


Ответы

Ответ 1



Это фича. С настройками по умолчанию UnicodeEncoding не проверяет входящие байты на валидность. Т.е. строку вы получаете, но т.к. на входе могли быть байты, не имеющие валидного отображения в строку, то в строке на этой позиции будет 0xFDFF (253, 255). На самом деле поведение при встрече невалидного символа зависит от Encoding, и его можно заменить на кастомный. Для Unicode, это Replacement Fallback. Если нужны подробности - посмотрите MSDN, Character Encoding in .NET, Replacement Fallback. Если хотите получать ошибку, а не "невалидный символ" - укажите throwOnInvalidBytes при создании кодировки: var encoding = new UnicodeEncoding(false, false, throwOnInvalidBytes: false); encoding.GetString(new byte[] { 215, 170, 8, 223, 101, 20, 107, 124}); // бросит исключение

Комментариев нет:

Отправить комментарий