Какую кодировку использовать для чтения строки из файла? - PullRequest
3 голосов
/ 12 мая 2011

Я анализирую файл (который я не генерирую), который содержит строку.Строка всегда предшествует 2 байта, которые говорят мне длину строки, которая следует.

Например:

05 00 53 70 6F 72 74

будет:

Sport

ИспользованиеC # BinaryReader, я читаю строку, используя:

string s = new string(binaryReader.ReadChars(size));

Иногда встречается странный символ в стиле фанк, который, кажется, выдвигает позицию потока дальше, чем следовало бы.Например:

0D 00 63 6F 6F 6B 20 E2 80 94 20 62 6F 6F 6B

Должно быть:

cook - book

, и хотя он хорошо читается, поток заканчивается на два байта дальше, чем должен ?!(Который затем портит остальную часть анализа.)

Я предполагаю, что это как-то связано с 0xE2 посередине, но я не совсем уверен, почему или как с этим бороться.

Любые предложения с благодарностью!

Ответы [ 3 ]

6 голосов
/ 12 мая 2011

Я предполагаю, что строка закодирована в UTF-8. 3-байтовая последовательность E2 80 94 соответствует одному символу Unicode U + 2014 (EM DASH).

1 голос
/ 12 мая 2011

В вашем первом примере

05 00 53 70 6F 72 74

ни один из байтов не превышает 0x7F, и это является пределом для 7-битного ASCII.UTF-8 сохраняет совместимость с ASCII, используя 8-й бит, чтобы указать, что будет больше информации.

0D 00 63 6F 6F 6B 20 E2 80 94 20 62 6F 6F 6B

Так же, как Тед заметил, что ваши "проблемы" начинаются с 0xE2, потому что это не 7 битСимвол ASCII.

Первый байт 0x0D говорит нам, что должно быть 11 символов, но есть 13 байтов.

0xE2 говорит нам, что мы нашли начало UTF-8 последовательность, так как самый старший бит установлен (больше 127).В этом случае последовательность , которая представляет - (EM Dash).

0 голосов
/ 12 мая 2011

Как вы правильно сказали, проблема в символе E2.BinaryReader.ReadChars (n) не читает n-байтов, но n символов Unicode в кодировке UTF-8.См. Википедию для Unicode Encodings .Термин, который вы используете, - это суррогатные персонажи.В UTF-8 символы в диапазоне от 000080 до 00009F представлены двумя байтами.Это является причиной несоответствия смещения.

Вам необходимо использовать BinaryReader.ReadBytes, чтобы исправить проблему смещения и передать ее экземпляру Encoding.

Чтобы это работало, вам нужно прочитать байты с помощью BinaryReader, а затем декодировать его с правильной кодировкой.Предполагая, что вы имеете дело с UTF-8, вам нужно передать байтовый массив в

Encoding.UTF8.GetString(byte [] rawData)

, чтобы получить обратно правильно закодированную строку.

Ваш, Алоис Краус

...