Кодировка UTF-8, почему префикс 10? - PullRequest
0 голосов
/ 26 октября 2018

Насколько я знаю, Unicode UTF-8 - это кодировка переменной длины.Т.е. символ может быть представлен 1 байтом, 2 байтами, 3 байтами или 4 байтами.

Например, символ Unicode U + 00A9 = 10101001 кодируется в UTF-8 как

110 00010 10 101001, т. Е. 0xC2 0xA9

Префикс 110 в первом байте указывает, что символ сохраняется с двумя байтами (потому что я считаю два единицы до нуля впрефикс 110).

Префикс в следующих байтах начинается с 10

4-байтовая кодировка UTF-8 будет выглядеть так:

11110 xxx 10 xxxxxx 10 xxxxxx 10 xxxxxx

Префикс 11110 (четыре единицы и ноль) обозначает четыре байта и т. Д.

Теперь мой вопрос:

Почему префикс 10 используется в следующих байтах? В чем преимущество такого префикса?Без префикса 10 в следующих байтах я мог бы использовать 3 * 2 = 6 бит больше, если я напишу:

1111 0000 xxxxxxxx xxxxxxxx xxxxxxxx

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Я не уверен, публично ли Кен Томпсон изложил свои причины, но есть прямое объяснение.

UTF-8 был разработан для обратной совместимости с ASCII. Поэтому все однобайтовые символы UTF-8 начинаются с 0.

Он мог бы быть спроектирован как можно более компактным, то есть с 10xxxxxx в качестве префикса для двухбайтовой последовательности и всеми восемью битами, доступными для байта продолжения. Однако официально Юникоду никогда не понадобятся все кодовые точки, которые UTF-8 делает доступными сейчас, и если пространство на диске для текстовых файлов имеет значение, пользователь сожмет их.

Таким образом, целью разработки с более высоким приоритетом было сделать как можно более простым алгоритмическое обнаружение UTF-8, чтобы как можно больше приложений могло его прозрачно поддерживать. Очень немногие документы в любой другой кодировке будут случайно выглядеть как моджибаке UTF-8 (но см. «Буш скрыл факты».) Однако нельзя допустить, чтобы это слишком сильно замедляло декодирование.

Следовательно, байты продолжения имеют префикс, отличный от префикса начальных байтов. Они находятся в старших разрядах, поэтому различать их просто на любом процессоре. Выбор префикса также попадает в простую логическую последовательность: одиночный ведущий 1 обозначает однобайтовую единицу, два означают начало двухбайтовой последовательности, три - начало трехбайтовой последовательности или четыре - начало четырехбайтовая последовательность. Ничто не указывает на отсутствие байтов продолжения вообще. Если когда-нибудь возникнет необходимость в расширении UTF-8, продолжение этой схемы будет тривиальным.

0 голосов
/ 26 октября 2018

Все последующие байты многобайтовых символов начинаются с двоичного 10, что указывает на то, что они являются последующими байтами.

Это позволяет выполнять повторную синхронизацию, если части передачи повреждены и / или отсутствуют.Например, если первый байт многобайтовой последовательности отсутствует, вы все равно можете выяснить, где начинается следующий символ.

Если последующие байты могут принимать любые значения, тогдабыло бы невозможно отличить последующие байты от однобайтовых кодированных символов.

...