Почему кодовые точки Unicode всегда записываются как минимум с 2 байтами? - PullRequest
0 голосов
/ 27 августа 2018

Почему кодовые точки Unicode всегда записываются 2 байтами (4 цифрами), даже если в этом нет необходимости?

Со страницы Википедии о UTF-8 :

$ -> U+0024
¢ -> U+00A2 

1 Ответ

0 голосов
/ 27 августа 2018

TL; DR Это все по соглашению Консорциума Unicode.

Вот формальное определение, найденное в Приложение A: Условные обозначения стандарта Unicode (я ссылался на самую последнюю на данный момент версию 11) :

В бегущем тексте отдельная кодовая точка Unicode выражается как U + n, где n равно четырем шесть шестнадцатеричных цифр, используя цифры 0–9 и заглавные буквы A – F (для 10–15, соответственно). Лидирующие нули опускаются, если в кодовой точке не будет меньше четырех шестнадцатеричные цифры - например, U + 0001, U + 0012, U + 0123, U + 1234, U + 12345, U + 102345.


Это шестнадцатеричные цифры, представляющие скалярные значения Unicode. Первоначально была доступна только первая плоскость, называемая базовой многоязычной, которая поддерживала диапазон от U+0000 до U+FFFF, который необходимо определить. Поэтому изначально кодировка U + всегда содержала 4 шестнадцатеричных символа.

Однако это позволяет использовать только 64 Ки (65536) кодовых точек для символов (исключая некоторые зарезервированные значения). Таким образом, один самолет был позже расширен до 17 самолетов. Ведущие нули подавляются для значений U+10000 или выше, поэтому следующий символ записывается как U+10000, а не U+010000. В настоящее время существует 17 плоскостей кодовых точек 64Ki (некоторые из которых могут быть зарезервированы), начиная с U + 0000, U + 10000 ... U + 90000 и, наконец, U100000.

Обозначение U + xxxx не соответствует кодировке UTF-8 . Он также не следует UTF-16, UTF-32 или устаревшим кодировкам UCS, как с прямым, так и с прямым порядком байтов. Однако кодирование символов в базовой многоязычной плоскости идентично UTF-16 (BE) в шестнадцатеричном формате. Обратите внимание, что UTF-16 может содержать единиц суррогатного кода , которые используются в качестве escape для кодирования символов в других плоскостях. Диапазоны этих единиц кода не отображаются на символы и, следовательно, не будут присутствовать в текстовом представлении кодовой точки.

См., Например, знак ПЛЮС-МИНУС, ±:

Unicode code point: U+00B1 (as a textual string)
UTF-8             : 0xC2 0xB1 (as two bytes)
UTF-16            : 0x00B1
UTF-16BE          : 0x00B1 as 0x00 0xB1 (as two bytes)
UTF-16LE          : 0x00B1 as 0xB1 0x00 (as two bytes)

https://www.fileformat.info/info/unicode/char/00b1/index.htm


Большая часть этой информации может быть найдена на sil.org .

...