Предел кодовой точки Юникода - PullRequest
12 голосов
/ 13 февраля 2011

Как объяснено здесь , все кодировки Unicode заканчиваются в самой большой точке кода 10FFFF Но я по-разному слышал, что они могут достигать 6 байтов, это правда?

Ответы [ 4 ]

7 голосов
/ 13 февраля 2011

UTF-8 претерпел некоторые изменения в течение своей жизни, и существует множество спецификаций (большинство из которых устарели в настоящее время), которые стандартизировали UTF-8. Большинство изменений были внесены для обеспечения совместимости с UTF-16 и для обеспечения постоянно растущего количества кодов.

Короче говоря, UTF-8 изначально был задан, чтобы разрешить кодовые точки длиной до 31 бита (или 6 байтов). Но с RFC3629 это было уменьшено до 4 байтов максимум. быть более совместимым с UTF-16.

В Википедии есть еще информация . Спецификация универсального набора символов тесно связана с историей Unicode и его форматом преобразования (UTF).

3 голосов
/ 02 января 2014

Наибольший код Unicode и используемые кодировки символов Unicode - это две вещи.Согласно стандарту, самая высокая кодовая точка на самом деле равна 0x10ffff, но поэтому вам понадобится всего 21 бит, который легко помещается в 4 байта, даже при потере 11 битов!

Я предполагаю, что с вашим вопросом о 6 байтах вы имеете в виду6-байтовая последовательность utf-8, верно?Как уже отвечали другие, используя механизм utf-8, вы действительно можете иметь дело с 6-байтовыми последовательностями, вы даже можете иметь дело с 7-байтовыми последовательностями и даже с 8-байтовыми последовательностями.7-байтовая последовательность дает вам диапазон того, что могут предложить следующие байты, 6 x 6 бит = 36 бит, а 8-байтовая последовательность дает вам 7 x 6 бит = 42 бита.Вы могли бы справиться с этим, но это не разрешено, потому что в этом нет необходимости, максимальная кодовая точка равна 0x10ffff.

Также запрещено использовать более длинные последовательности, чем необходимо, как упомянул Hibou57.С utf-8 нужно всегда использовать самую короткую из возможных последовательностей, иначе она будет считаться недействительной!Конечно же, символ ASCII должен быть 7-битным однобайтовым.Во-вторых, 4-байтовая последовательность utf-8 дает вам 3 бита полезной нагрузки в начальном байте и 18 бит полезной нагрузки в следующих байтах, которые составляют 21 бит, и это соответствует вычислению суррогатов при использовании кодирования utf-16,Смещение 0x10000 вычитается из кодовой точки, а оставшиеся 20 битов попадают в область с высокой суррогатной нагрузкой, каждая из 10 битов.Третье и последнее, что в utf-8 не разрешается кодировать значения hi- или -lo-surrogate.Суррогаты - это не символы, а контейнеры для них, суррогаты могут появляться только в файлах с кодировкой utf-16, а не в файлах с кодировкой utf-8 или utf-32.

1 голос
/ 22 октября 2012

Действительно, для некоторого представления о кодировке UTF-8 UTF-8 может технически разрешать кодировать кодовые точки за пределами вечно фиксированного верхнего предела допустимого диапазона; поэтому можно кодировать кодовую точку за пределами этого диапазона, но она нигде не будет действительной кодовой точкой. С другой стороны, вы можете закодировать символ с ненужными обнуленными старшими битами, напр. кодирование кодовой точки ASCII с несколькими битами, как в 2#1100_0001#, 2#1000_0001# (с использованием нотации Ады), что для буквы ASCII A UTF ‑ 8, кодированной двумя байтами. Но тогда, это может быть отклонено некоторыми фильтрами безопасности / безопасности, при этом использовании для взлома и пиратства. RFC 3629 имеет некоторые объяснения по этому поводу. Нужно просто придерживаться кодирования правильных кодовых точек (как определено Unicode), безопасного пути (без посторонних байтов).

...