Циклопедия скорбит по жертвам террористического акта в Крокус-Сити (Красногорск, МО)

Формы представления Юникода

Материал из Циклопедии
(перенаправлено с «UTF-8»)
Перейти к навигации Перейти к поиску

Формы представления Юникода (англ. Unicode Transformation Formats) реализуют последовательность кодовых позиций (и, как следствие, текст) в виде, понимаемом программным обеспечением. Главными из них являются две: UTF-8[⇨] (кодирование 8-битными кодами) и UTF-16[⇨] (кодирование 16-битными кодовыми единицами). Однако, поскольку октеты (в просторечии: байты) являются de facto стандартной формой цифровой информации, а 16-битное слово занимает два октета, UTF-16 реализуется в двух разновидностях: UTF-16BE и UTF-16LE.

UTF-8[править]

Логотип ВикиреальностиВ энцикло­пе­дии Ви­ки­реаль­ность есть ста­тья UTF-8

UTF-8 является самосинхронизированным префиксным кодом, кодирующим каждую из кодовых позицию Юникода последовательностью от 1 до 4 байт (октетов). 128 символов ASCII кодируются как есть, а каждый из следующих 1920 символов Юникода требует в UTF-8 два байта. Оставшиеся в BMP кодовые позиции преобразуются в трёхбайтные коды, а символы других кодовых плоскостей Юникода требуют по четыре байта каждый. Длина кодовой последовательности однозначно определяется значением её ведущего (первого) октета. Таблица показывает, как UTF-8 использует каждое из 128 возможных значений октета с 1 в старшем бите.

  _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E _F
8_ +00 +01 +02 +03 +04 +05 +06 +07 +08 +09 +0A +0B +0C +0D +0E +0F
9_ +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +1A +1B +1C +1D +1E +1F
A_ +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +2A +2B +2C +2D +2E +2F
B_ +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +3A +3B +3C +3D +3E +3F
C_ (2)
0000
(2)
0040
C1, лат.
0080
лат.
00C0
лат. Extd-A
0100
лат. Extd-A
0140
лат. Extd-B
0180
лат. Extd-B
01C0
лат. Extd-B
0200
МФА
0240
МФА
0280
симв- мод
02C0
диакр.
0300
диакр.
0340
греч.
0380
греч.
03C0
D_ кир.
0400
кир.
0440
кир.
0480
кир.
04C0
кир.
0500
арм.
0540
евр.
0580
евр.
05C0
араб.
0600
араб.
0640
араб.
0680
араб.
06C0
Syriac
0700
араб.
0740
Thaana
0780
N'Ko
07C0
E_ Indic
0800
?
1000
симв.
2000
кана
3000
CJK
4000
CJK
5000
CJK
6000
CJK
7000
CJK
8000
CJK
9000
Asian
A000
ханг.
B000
ханг.
C000
ханг.
D000
PUA
E000
Forms
F000
F_ 10000 40000 80000 C0000 100000 140000 180000 1C0000 (5) (5) (5) (5) (6) (6)

     Байты-продолжения, никогда не начинают кодовую последовательность. Кодируют по 6 бит кода Unicode.

     Ведущие байты, обладающие полным набором кодовых последовательностей (комбинаций с нужным количеством байтов-продолжений). Внизу написано (в шестнадцатеричном коде), откуда начинаются кодируемые данным ведущим байтом позиции Юникода. Длина кодовой последовательности равна двум для 0xC_ и 0xD_, трём для 0xE_, и четырём для ведущих байтов 0xF0–0xF4.

     Ведущие байты, не допускающие (по разным причинам) все возможные комбинации с нужным количеством байтов-продолжений.

     Запрещённые байты. Ведущие байты начиная с 0xF5, теоретически, могут быть использованы в случае расширения кодового пространства (0xF8 и далее потребуют последовательности длиной 5 и более).


На сегодняшний день (2021 год) данная форма является повсеместной во Всемирной паутине. Системы Unix реализуют текстовые файлы в Юникоде почти исключительно в UTF-8.

UTF-16[править]

ст.\мл. DC00 DC01    ⋯    DFFF
D800 010000 010001 0103FF
D801 010400 010401 0107FF
  ⋮
DBFF 10FC00 10FC01 10FFFF

UTF-16 кодирует Юникод 16-битными кодовыми единицами. Адресация «правильно расположенного» в памяти 16-битного слова является довольно «дешёвой» операцией на многих современных вычислительных системах. Коды из BMP занимают одну единицу, все прочие — две, для чего используются зарезервированные «суррогатные» кодовые позиции U+D800–U+DFFF. В последнем случае первым идёт один из 1024 кодов 0xD8…, 0xD9…, 0xDA…, 0xDB…, а вторым — один из 1024 кодов 0xDC…, 0xDD…, 0xDE…, 0xDF…, что даёт возможность закодировать все 220 кодовых позиций Юникода, лежащих за пределами BMP.

Теоретически, UTF-16 может быть более эффективной, чем UTF-8, при кодировании китайского, японского, хинди и некоторых других языков. При применении для языков разметки (таких, как HTML) и прочих компьютерных языков выигрыш в сравнении с UTF-8 редко достигаются, поскольку компьютерные языки вносят в текст много символов ASCII.

Встречается, главным образом, в бинарных файлах (и оперативной памяти) приложений, так или иначе использующих Java или JavaScript. Закодированные в UTF-16LE файлы были в недавнем прошлом частым явлением в Microsoft Windows2019 года Microsoft стала рекомендовать кодировать файлы в UTF-8). Старые версии Microsoft Windows (такие, как Windows NT 4 и Windows 95/98) могли работать только с символами из BMP.

UTF-16BE и UTF-16LE[править]

При выводе данных в файл или передаче по сети 16-битные единицы необходимо преобразовать в восьмибитную форму. Можно сначала записать (передать) старший октет, а затем младший — получается UTF-16BE. Либо обменять старший и младший местами — получается UTF-16LE. Для различения этих двух вариантов UTF-16 иногда используется невидимый символ U+FEFF (англ. byte-order mark), поскольку при смене порядка байт он отображается в зарезервированную кодовую позицию U+FFFE.

CESU-8[править]

Является способом представления UTF-16 (см. выше) в виде, имитирующем 8-битную кодировку. Для текстов, не выходящих за пределы BMP, данная кодировка идентична UTF-8; в остальном отличие заключается в том, что кодовые слова 0xD800–0xDFFF UTF-16 кодируются по той же схеме, что и прочие коды в UTF-8 (таким образом символ, занимающий два кодовых слова UTF-16, займёт шесть октетов). В собственно Юникоде коды U+D800–U+DFFF запрещены к использованию.

GB 18030[править]

Используемая в КНР кодировка, представляющая (подобно UTF-8) символы ASCII как есть, а для остальных вводящая кодовые последовательности из двух или четырёх октетов. Является расширением кодировки GBK (которая, в свою очередь, надстроена над GB 2312). Имеет кодовое пространство даже шире, чем Юникод.

Punycode[править]

Кодирование для коротких строк в Юникоде в форме строк из ограниченного набора ASCII-символов. Применяется в доменных именах.

Сжимающие кодировки[править]

SCSU — оптимизированная (по размеру данных) кодировка Юникода, пригодная для текстов, написанных на одном языке. BOCU-1 — патентованная (компанией IBM) система сжатия текста в Юникоде, якобы более эффективная, чем SCSU. Обе кодировки не могут применяться с HTML, что серьёзно ограничивает их потенциальную применимость.

Устаревшие, экзотические и шуточные формы[править]

Описаны также такие формы, как UTF-32, UTF-7, UTF-1, UTF-EBCDIC, UTF-9 и UTF-18. UTF-32 иногда применяться внутри программ (то есть, в оперативной памяти компьютера).

Кодировки символов
Основы Алфавиттекстнабор символовконверсия
Исторические кодировки Докомп.: семафорная (Макарова)МорзеБодоМТК-2
Комп.: 6-битнаяУППRADIX-50EBCDICДКОИ-8 ) • КОИ-7ISO 646
современное
8-битное
представление
символы ASCIIуправляющиепечатные )
8-битные код.стр. ISO 8859 • кириллица (КОИ-8ГОСТ 19768-87MacCyrillic)
Windows 12501251 (кир.)1252125312541255125612571258WGL4
IBM & DOS 437850852855866 «альт.»МИКНИИ ЭВМ
Многобайтные Традиционные DBCSGB 2312 ) • HTML
Unicode UTFсписок символов (кириллица • латиница)
Связанные темы интерфейс пользователяраскладка клавиатурылокальперевод строкикракозябрытранслитнестандартные шрифты