Подтвердить что ты не робот

Предел точки кода Unicode

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Самый большой код кодировки 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-суррогатные значения. Суррогаты - это не символы, а контейнеры для них, суррогаты могут появляться только в utf-16, а не в файлах, закодированных utf-8 или utf-32.

Ответ 4

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