Ошибка в Encoding.Unicode

197
19 апреля 2018, 09:45

Имею код:

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

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

Answer 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}); // бросит исключение
READ ALSO
Поиск изображения на экране

Поиск изображения на экране

Я хочу реализовать простенький скриптСмысл его заключается в том, чтобы когда вылезает окно с ошибкой на каком-либо сайте моя программа искала...

217
Регистрация вспомогательного метода в web.config ASP.NET MVC

Регистрация вспомогательного метода в web.config ASP.NET MVC

Проблема очень простаяСоздал вспомогательный метод в отдельном классе

170