Как этот поток октетов интерпретируется как кодировка UTF-8 на иврите? - PullRequest
3 голосов
/ 27 мая 2011

Следующий поток байтов обозначен как UTF-8, он содержит предложение на иврите: דירות לשותפים בתל אביב - הומלס. Я пытаюсь понять кодировку.

ubuntu@ip-10-126-21-104:~$ od -t x1 homeless-title-fromwireshark_followed_by_hexdump.txt
0000000 0a 09 d7 93 d7 99 d7 a8 d7 95 d7 aa 20 d7 9c d7
0000020 a9 d7 95 d7 aa d7 a4 d7 99 d7 9d 20 20 d7 91 d7
0000040 aa d7 9c 20 d7 90 d7 91 d7 99 d7 91 20 2d 20 d7
0000060 94 d7 95 d7 9e d7 9c d7 a1 0a
0000072
ubuntu@ip-10-126-21-104:~$ file -i homeless-title-fromwireshark_followed_by_hexdump.txt
homeless-title-fromwireshark_followed_by_hexdump.txt: text/plain; charset=utf-8

Файл UTF-8, я проверил это, открыв блокнот (windows 7), введя символ иврита ד и сохранив файл. Результат которого дает следующее:

ubuntu@ip-10-126-21-104:~$ od -t x1 test_from_notepad_utf8_daled.txt
0000000 ef bb bf d7 93
0000005
ubuntu@ip-10-126-21-104:~$ file -i test_from_notepad_utf8_daled.txt
test_from_notepad_utf8_daled.txt: text/plain; charset=utf-8

Где ef bb bf - это спецификация, закодированная в форме utf-8, а d7 93 - это именно та последовательность байтов, которая появляется в исходном потоке после 0a 09 (новая строка, вкладка в ascii).

Проблема здесь в том, что с помощью кодовых страниц Unicode ד должно быть закодировано как 05 D3, так почему и как кодировка utf-8 стала d7 93?

d7 93 в двоичном виде - 11010111 10010011, а
05 D3 в двоичном виде - 00000101 11010011

Кажется, я не могу найти правильное преобразование, которое будет иметь смысл для этих кодировок, которые (на мой взгляд) представляют ту же сущность Unicode, что и есть "HEBREW LETTER DALET"

Спасибо,
Максим.

Ответы [ 3 ]

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

Unicode определяет (среди прочего) набор «кодовых точек» и дает каждому числовое значение. Значение для HEBREW LETTER DALET - U + 05D3 или 0x05D3. Но это всего лишь число, и это НЕ говорит вам, как «кодировать» кодовую точку (то есть набор фактических битов) в файле / в памяти ... UTF-8 (а также UTF-16, UTF- 32 и множество других схем) расскажет вам, как это сделать.

На самом деле существует формальный способ перевода кодовых точек Unicode в символы UTF-8 (но это совершенно другой вопрос SO). Оказывается, в UTF-8 HEBREW LETTER DALET кодируется как 0xD7 0x93. Кстати, если вы найдете текстовый редактор, который позволяет вам сохранять как UTF-32 или UCS-4, вы обнаружите, что (в дополнение к очень большому файлу) байты, которые вы видите с помощью hex-редактора, должны совпадать кодовые точки из спецификации Unicode.

Эта страница может дать немного дополнительной информации о некоторых представлениях для этого одного символа.

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

4 голосов
/ 27 мая 2011

Кодовые точки Unicode U + 0000..U + 007F кодируются в UTF-8 как один байт 0x00..0x7F.

Кодовые точки Unicode u + 0080..U + 07FF (включая ПИСЬМО ИВРИЦА)DALET U + 05D3) кодируются в UTF-8 как два байта.Двоичные значения для них могут быть разделены на группу из 5 битов и группу из 6 битов, как в xxxxxyyyyyy.Первый байт представления UTF-8 имеет битовую комбинацию 110xxxxx;вторая имеет битовую комбинацию 10yyyyyy.

0x05D3 = 0000 0101 1101 0011 

Последние 6 битов 0x05D3 - 010011;с префиксом 10, что дает 1001 0011 или 0x93.Предыдущие 5 битов - 10111;с префиксом 110, что дает 1101 0111 или 0xD7.

Следовательно, кодировка UTF-8 для U + 05D3 равна 0xD7 0x93.

Существует больше правил для кодовых точек Unicode U + 0800вверх, для которого требуется 3 или 4 (но не больше) байта для представления UTF-8.Байты продолжения всегда имеют битовый шаблон 10yyyyyy.Первые байты имеют битовые комбинации 1110xxxx (3-байтовые значения) и 11110xxx (4-байтовые значения).Существует ряд байтовых значений, которые не могут отображаться в допустимом UTF-8;они 0xC0, 0xC1 и 0xF5..0xFF.

2 голосов
/ 27 мая 2011

Устаревшие кодовые страницы определяли набор символов и их отображение в последовательности байтов.Unicode разделяет понятия набор символов и кодировка символов .

Таким образом, набор символов Unicode представляет собой список кодовых точек .Каждой кодовой точке присваивается уникальное значение в качестве идентификатора - ד - это U + 05D3.

Кодировки - форматы преобразования Unicode - описывают, как кодировать каждый код точка как последовательностькод единицы .

UTF-8 использует 1-октетную единицу кода, а кодовые точки кодируются как последовательности от одного до четырех байтов.Алгоритм описан в RFC 3629 .

A аналогичная процедура существует для UTF-16, который использует 2-октетные кодовые единицы - каждая кодовая точка составляет два или четыре байта,И для UTF-32 ничего не нужно делать, кроме как сделать каждое значение длиной четыре байта.Эти кодировки могут иметь форму с большим или меньшим порядком байтов, поэтому U + 05D3 может быть 00 00 05 D3 или D3 05 00 00 в UTF-32.Спецификация часто используется для определения того, какая кодировка используется и что такое порядковый номер, если кодировка данных неоднозначна.

Существует также UTF-7, но я никогда не видел его вдикий.

...