System.Text.Encoding не является - PullRequest
       40

System.Text.Encoding не является

1 голос
/ 19 ноября 2009

Я обнаружил проблему, с которой я столкнулся, до следующего необъяснимого поведения в классе .NET System.Text.Encoding:

byte[] original = new byte[] { 128 };
string encoded = System.Text.Encoding.UTF8.GetString(original);
byte[] decoded = System.Text.Encoding.UTF8.GetBytes(encoded);
Console.WriteLine(original[0] == decoded[0]);

Неужели я ожидаю, что слишком много, что декодированное должно совпадать с оригиналом в приведенном выше?

UTF8, UTF7, UTF32, Unicode и ASCII - все это приводит к различным ошибкам. Что происходит?

Ответы [ 4 ]

4 голосов
/ 19 ноября 2009

Это недопустимая последовательность байтов UTF8.

Вам нужно

byte[] original = new byte[] { 0xc2, 128 };

Ничего общего с метками порядка байтов.

Обновление

Или лучше сделать

char[] c = { (char)128 };
4 голосов
/ 19 ноября 2009

Исходные данные являются недопустимой последовательностью UTF8.

декодированный = {0xef, 0xbf, 0xbd}

Поиск этой строки показал следующее: http://en.wikipedia.org/wiki/Unicode_Specials. Это код UTF-8 для символа замены, используемый вместо недопустимых символов.

1 голос
/ 19 ноября 2009

Как правило, вы не можете использовать обратную дорогу таким образом, и вы ошибаетесь, полагая, что сможете сделать это для произвольной кодировки и, в частности, для любой кодировки UTF.

Однако есть кодировка, которая позволит вам использовать обход всех значений байтов - Latin1 aka ISO-8859-1 aka CP28591. Эта кодировка похожа, но не идентична кодировке Windows ANSI по умолчанию и полезна для сценариев, где важно циклическое обратное использование, например. запись потока, который смешивает текст и управляющие символы в последовательный порт.

См. Этот ответ или другие вопросы, в которых упоминается латиница 1.

1 голос
/ 19 ноября 2009

Это потому, что при преобразовании в строку он будет содержать UTF-8 BOM , которые в начале составляют три байта.

...