Действительны ли 6-октетные последовательности UTF-8? - PullRequest
7 голосов
/ 24 августа 2010

Может ли UTF-8 кодировать 5 или 6-байтовые последовательности, позволяя кодировать все символы Юникода? Я получаю противоречивые стандарты. Мне нужно иметь возможность поддерживать каждый символ Unicode , а не только те, которые находятся в диапазоне U + 0000..U + 10FFFF.

(все цитаты из RFC 3629 )

Раздел 3:

В UTF-8 символы из диапазона U + 0000..U + 10FFFF (UTF-16 доступный диапазон) кодируются с использованием последовательностей от 1 до 4 октетов. только октет "последовательности" из одного имеет бит высшего порядка, установленный в 0, остальные 7 бит используются для кодирования номера символа. В последовательность из n октетов, n> 1, исходный октет имеет n старшего порядка биты установлены в 1, за которыми следует бит в 0. Остальные биты этот октет содержит биты из номера символа, который будет закодирован. Все следующие октеты имеют бит высшего порядка, установленный в 1 и следующий бит установлен в 0, оставляя 6 бит в каждом, чтобы содержать биты от символа для кодирования.

То есть не все возможные символы могут быть закодированы с помощью UTF-8? Означает ли это, что я не могу кодировать символы из разных плоскостей, чем BMP?

Раздел 2:

Значения октетов C0, C1, F5-FF никогда не появляются.

Это означает, что мы не можем кодировать значения UTF-8 с 5 или 6 октетами (или даже некоторые с 4, которые не в вышеуказанном диапазоне)?

Раздел 12:

Ограничен диапазон символов до 0000-10FFFF (UTF-16 доступный диапазон).

Глядя на предыдущий RFC это подтверждает ... они уменьшили диапазон символов.

Раздел 10:

Другая проблема безопасности возникает при кодировании в UTF-8: ISO / IEC 10646 Описание UTF-8 позволяет кодировать номера символов до U + 7FFFFFFF, получая последовательности до 6 байтов. Поэтому есть риск переполнения буфера, если диапазон номеров символов не явно ограничено U + 10FFFF или если размер буфера не учитывается учитывать возможность 5- и 6-байтовых последовательностей.

То есть эти последовательности разрешены согласно определению ISO / IEC 10646, но не определению RFC 3629? Которому я должен следовать?

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 24 августа 2010

Нет Unicode символов за пределами 10FFFF, BMP охватывает от 0000 до FFFF.

UTF-8 четко определено для 0-10FFFF.

1 голос
/ 24 августа 2010

И UTF-8, и UTF-16 позволяют кодировать все символы Юникода.UTF-8 запрещается кодировать верхнюю и нижнюю суррогатные половины (которые использует UTF-16) или значения выше U + 10FFFF, что не является допустимым Unicode.

Обратите внимание, что BMP заканчиваетсяU + FFFF.

0 голосов
/ 31 августа 2010

Я должен был бы сказать нет: кодовые точки Unicode действительны для диапазона [0, 0x10FFFF], и они соответствуют 1-4 октетам. Так что, если вы встретили 5- или 6-октетную кодированную точку UTF-8, это недопустимая кодовая точка - там определенно ничего не назначено. Я немного озадачен тем, почему они есть в стандарте ISO - я не смог найти объяснения.

Это заставляет задуматься, однако, возможно, когда-нибудь в будущем они расширятся за пределы U + 10FFFF. 0x10FFFF допускает более миллиона символов, но есть много символов, и это будет зависеть от того, сколько в итоге будет закодировано. (Ради здравого смысла, будем надеяться, нет, миллион символов - это много!) UTF-32 может обрабатывать больше кодов, и, как вы обнаружили, UTF-8 может. Это действительно был бы UTF-16, которому не повезло - где-то в спектре кодовых точек понадобилось бы больше суррогатных пар.

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