Почему HTML обрабатывает 2-х и 3-х байтовые символы одинаково, но не 4-х байтовые? - PullRequest
3 голосов
/ 24 февраля 2020

Я выполняю GUI работу для веб-сайта и использую атрибут "maxlength" для некоторых текстовых вводов, некоторые из которых могут содержать символы Unicode.

Скажем, у меня есть текстовое поле с maxlength = 50, и я заполняю его полными 2-байтовыми символами Unicode (UTF-16). Я могу получить 50 символов в текстовом поле.

Я также могу сделать то же самое с 3-байтовыми символами. 50 из них.

Однако я могу получить только 25 4-байтовых символов в поле. Разумеется, поскольку в два раза больше байтов, но почему он по-прежнему нормально реагирует при использовании 3-байтовых символов? Как обрабатывается дополнительный байт?

1 Ответ

3 голосов
/ 24 февраля 2020

Символы Unicode обычно могут быть закодированы в UTF-8, UTF-16 или UTF-32 ( см. Их faq ). Использование 2, 3 и 4 байтовых символов говорит мне, что вы работаете с точки зрения UTF-8.

Однако атрибут maxlength определен как максимальное количество единиц кода UTF-16 , а не количество байтов. Каждая единица кода UTF-16 составляет два байта.

2-байтовый символ UTF-8 будет одной единицей кода UTF-16. Трехбайтовый символ UTF-8 также будет представлять собой единицу кода UTF-16. Однако 4-байтовый символ UTF-8 представляет символ Unicode больше 0xFFFF. UTF-16 представляет это как две кодовые единицы (называемые суррогатными парами, см. Faq, связанный выше).

...