28-09-2023
Юнико́д[1] (чаще всего) или Унико́д[2] (англ. Unicode) — стандарт кодирования символов, позволяющий представить знаки почти всех письменных языков[3].
Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. Unicode Consortium, Unicode Inc.)[4][5]. Применение этого стандарта позволяет закодировать очень большое число символов из разных письменностей: в документах Unicode могут соседствовать китайские иероглифы, математические символы, буквы греческого алфавита, латиницы и кириллицы, при этом становится ненужным переключение кодовых страниц[6].
Стандарт состоит из двух основных разделов: универсальный набор символов (англ. UCS, universal character set) и семейство кодировок (англ. UTF, Unicode transformation format). Универсальный набор символов задаёт однозначное соответствие символов кодам — элементам кодового пространства, представляющим неотрицательные целые числа. Семейство кодировок определяет машинное представление последовательности кодов UCS.
Коды в стандарте Юникод разделены на несколько областей. Область с кодами от U+0000 до U+007F содержит символы набора ASCII с соответствующими кодами. Далее расположены области знаков различных письменностей, знаки пунктуации и технические символы. Часть кодов зарезервирована для использования в будущем[7]. Под символы кириллицы выделены области знаков с кодами от U+0400 до U+052F, от U+2DE0 до U+2DFF, от U+A640 до U+A69F (см. Кириллица в Юникоде)[8].
К концу 1980-х годов стандартом стали 8-битные символы, при этом существовало множество разных 8-битных кодировок, и постоянно появлялись всё новые. Это объяснялось как постоянным расширением круга поддерживаемых языков, так и стремлением создать кодировку, частично совместимую с какой-нибудь другой (характерный пример — появление альтернативной кодировки для русского языка, обусловленное эксплуатацией западных программ, созданных для кодировки CP437). В результате появилось несколько проблем:
Было признано необходимым создание единой «широкой» кодировки. Кодировки с переменной длиной символа, широко использующиеся в Восточной Азии, были признаны слишком сложными в использовании, поэтому было решено использовать символы фиксированной ширины. Использование 32-битных символов казалось слишком расточительным, поэтому было решено использовать 16-битные.
Таким образом, первая версия Юникода представляла собой кодировку с фиксированным размером символа в 16 бит, то есть общее число кодов было 216 (65 536). Отсюда происходит практика обозначения символов четырьмя шестнадцатеричными цифрами (например, U+04F0
). При этом в Юникоде планировалось кодировать не все существующие символы, а только те, которые необходимы в повседневном обиходе. Редко используемые символы должны были размещаться в «области пользовательских символов» (private use area), которая первоначально занимала коды U+D800…U+F8FF
. Чтобы использовать Юникод также и в качестве промежуточного звена при преобразовании разных кодировок друг в друга, в него включили все символы, представленные во всех наиболее известных кодировках.
В дальнейшем, однако, было принято решение кодировать все символы и в связи с этим значительно расширить кодовую область. Одновременно с этим, коды символов стали рассматриваться не как 16-битные значения, а как абстрактные числа, которые в компьютере могут представляться множеством разных способов (см. Способы представления).
Поскольку в ряде компьютерных систем (например, Windows NT[10]) фиксированные 16-битные символы уже использовались в качестве кодировки по умолчанию, было решено все наиболее важные знаки кодировать только в пределах первых 65 536 позиций (так называемая англ. basic multilingual plane, BMP). Остальное пространство используется для «дополнительных символов» (англ. supplementary characters): систем письма вымерших языков или очень редко используемых китайских иероглифов, математических и музыкальных символов.
Для совместимости со старыми 16-битными системами была изобретена система UTF-16, где первые 65 536 позиций, за исключением позиций из интервала U+D800…U+DFFF, отображаются непосредственно как 16-битные числа, а остальные представляются в виде «суррогатных пар» (первый элемент пары из области U+D800…U+DBFF, второй элемент пары из области U+DC00…U+DFFF). Для суррогатных пар была использована часть кодового пространства (2048 позиций), отведённого «для частного использования».
Поскольку в UTF-16 можно отобразить только 220+216−2048 (1 112 064) символов, то это число и было выбрано в качестве окончательной величины кодового пространства Юникода (диапазон кодов: 0x000000-0x10FFFF)
Хотя кодовая область Юникода была расширена за пределы 216 уже в версии 2.0, первые символы в «верхней» области были размещены только в версии 3.1.
Роль этой кодировки в веб-секторе постоянно растёт, на начало 2010 доля веб-сайтов, использующих Юникод, составила около 50 %[11].
Работа по доработке стандарта продолжается. Новые версии выпускаются по мере изменения и пополнения таблиц символов. Параллельно выпускаются новые документы ISO/IEC 10646.
Первый стандарт выпущен в 1991 году, последний — в 2014, следующий ожидается летом 2015 года[12]. Стандарты версий 1.0 — 5.0 публиковались, как книги, и имеют ISBN.
Номер версии стандарта составлен из трёх цифр (например, "4.0.1"). Третью цифру меняют при внесении в стандарт небольших изменений, не добавляющих новых символов.
Версии Юникода | ||||||
---|---|---|---|---|---|---|
Номер версии | Дата публикации | ISBN книги | Издание ISO/IEC 10646 | Количество письменностей | Количество символов[A 1] | Изменения |
1.0.0 | Октябрь 1991 | ISBN 0-201-56788-1 (Vol.1) | 24 | 7161 | Изначально таблицы Юникода содержали символы следующих письменностей: арабское письмо, армянское письмо, бенгальское письмо, чжуиньское письмо, кириллица, деванагари, грузинское письмо, греческое и коптское письмо, гуджарати, гурмукхи, хангыль, еврейское письмо, хирагана, каннада, Катакана, лаосское письмо, латинское письмо, малаялам, ория, тамильское письмо, телугу, тайское письмо и тибетское письмо[13] | |
1.0.1 | Июнь 1992 | ISBN 0-201-60845-6 (Vol.2) | 25 | 28 359 | Добавлено 20 902 идеограммы китайского, японского и корейского письма[14] | |
1.1 | Июнь 1993 | ISO/IEC 10646-1:1993 | 24 | 34 233 | Добавлено более 4306 слогов хангыля, дополнивших уже имеющиеся в таблицах 2350 символов. Удалены символы тибетского письма[15] | |
2.0 | Июль 1996 | ISBN 0-201-48345-9 | ISO/IEC 10646-1:1993 и Amendments 5, 6, 7 | 25 | 38 950 | Удалены добавленные ранее слоги хангыля, и добавлены 11 172 новых слога хангыля с новыми кодами. Возвращены удалённые ранее символы тибетского письма; символы получили новые коды и были размещены в разных таблицах. Введён механизм сурогатных (англ. surrogate) символов. Выделено место для плоскостей (англ. planes) 15 и 16[16] |
2.1 | Май 1998 | ISO/IEC 10646-1:1993, Amendments 5, 6, 7, два символа из Amendment 18 | 25 | 38 952 | Добавлен символ евро[17] | |
3.0 | Сентябрь 1999 | ISBN 0-201-61633-5 | ISO/IEC 10646-1:2000 | 38 | 49 259 | Добавлены символы следующих письменностей: письмо чероки, эфиопское письмо, кхмерское письмо, монгольские письменности, бирманское письмо, огамическое письмо, руны, сингальское письмо, сирийское письмо, тана, канадское слоговое письмо и письмо и, а также символы шрифта Брайля[18] |
3.1 | Март 2001 | ISO/IEC 10646-1:2000
ISO/IEC 10646-2:2001 |
41 | 94 205 | Добавлены символы следующих письменностей: дезеретское письмо, готское письмо и старое итальянское письмо, а также символы западной и византийской музыки, 42 711 идеограмм китайского, японского и корейского письма[19] | |
3.2 | Март 2002 | ISO/IEC 10646-1:2000 и Amendment 1
ISO/IEC 10646-2:2001 |
45 | 95 221 | Добавлены символы следующих писбменностей: письмо buhid, письмо hanunó'o, байбайин и письмо тагбанва[20] | |
4.0 | Апрель 2003 | ISBN 0-321-18578-1 | ISO/IEC 10646:2003 | 52 | 96 447 | Добавлены символы следующих письменностей: кипрское письмо, письмо лимбу, линейное письмо Б, сомалийское письмо, письмо shavian, письмо tai le и угаритское письмо, а также символы гексаграмм[21] |
4.1 | Март 2005 | ISO/IEC 10646:2003 и Amendment 1 | 59 | 97 720 | Добавлены символы следующих письменностей: письмо лонтара, глаголица, письмо кхароштхи, новое письмо tai lue, древнеперсидская клинопись, силхетское нагари и древнеливийское письмо. Символы коптского письма были отделены от символов греческого письма. Также добавлены символы старых греческих цифр и музыкальные символы[22] | |
5.0 | Июль 2006 | ISBN 0-321-48091-0 | ISO/IEC 10646:2003, Amendments 1, 2, четыре символа из Amendment 3 | 64 | 99 089 | Добавлены символы следующих письменностей: балийское письмо, клинопись, письмо нко, монгольское квадратное письмо и финикийское письмо[23] |
5.1 | Апрель 2008 | ISO/IEC 10646:2003 и Amendments 1, 2, 3, 4 | 75 | 100 713 | Добавлены символы следующих письменностей: карийское письмо, чамская письменность, письмо kayah li, письмо лепча, ликийское письмо, лидийское письмо, письмо ол-чики, реджангское письмо, письмо саураштра, сунданское письмо и письмо ваи. Добавлены символы с фестского диска, символы для фишек игр маджонг и домино, заглавная буква эсцет (ß), а также символы — аббревиатур scribal, используемых в средневековых рукописях. Новыми символами дополнен набор символов бирманского письма[24] | |
5.2 | Октябрь 2009 | ISO/IEC 10646:2003 и Amendments 1, 2, 3, 4, 5, 6 | 90 | 107 361 | Добавлены символы следующих письменностей: авестийское письмо, письмо бамум, египетское иероглифическое письмо (по списку Гардинера, содержащему 1071 символ), письмо imperial aramaic, письмо inscriptional pahlavi, письмо inscriptional parthian, яванское письмо, письмо кайтхи, письмо лису, письмо манипури, южноаравийское письмо, древнетюркское руническое письмо, самаритянское письмо, письмо tai tham и письмо tai viet. Добавлены 4149 новых идеиграмм китайского, японского и корейского письма (CJK-C), символы ведийского письма, а также расширен набор символов Jamo старого хангыля[25] | |
6.0 | Октябрь 2010 | ISO/IEC 10646:2010 и символ валюты Индии | 93 | 109 449 | Добавлены символы следующих письменностей: батакское письмо, письмо брахми, письмо mandaic. Добавлены символы игральных карт, дорожных знаков, географических карт, алхимии, emoticon и emoji. Добавлены 222 идеограммы китайского, японского и корейского письма (CJK-D)[26] | |
6.1 | Январь 2012 | ISO/IEC 10646:2012 | 100 | 110 181 | Добавлены символы следующих письменностей: письмо chakma, мероитский рукописный шрифт и мероитские иероглифы, письмо мяо, письмо шарада, письмо sora sompeng и письмо такри[27] | |
6.2 | Сентябрь 2012 | ISO/IEC 10646:2012 и символ турецкой валюты | 100 | 110 182 | Добавлен символ турецкой валюты[28] | |
6.3 | Сентябрь 2013 | ISO/IEC 10646:2012 и шесть символов | 100 | 110 187 | Добавлено пять символов для форматирования двунаправленного текста[29] | |
7.0 | Июнь 2014 | ISO/IEC 10646:2012, Amendments 1, 2 и символ рубля | 123 | 113 021 | Добавлены символы следующих письменностей: письмо басса, агванское письмо, письмо duployan, эльбасанское письмо, письмо грантха, письмо khojki, письменность khudawadi, линейное письмо А, письмо mahajani, письмо manichaean, письмо кикакуи, письмо моди, письмо mro, набатейское письмо, северноаравийское письмо, древнепермское письмо, письмо pahawh hmong, письмо palmyrene, письмо pau cin hau, письмо psalter pahlavi, сиддхаматрика, письмо tirhuta, варанг-кшити и орнамент dingbat[30] | |
Примечания |
Хотя формы записи UTF-8 и UTF-32 позволяют кодировать до 231 (2 147 483 648) кодовых позиций, было принято решение использовать лишь 1 112 064 для совместимости с UTF-16. Впрочем, даже и этого на текущий момент более чем достаточно — в версии 6.0 используется чуть менее 110 000 кодовых позиций (109 242 графических и 273 прочих символов).
Кодовое пространство разбито на 17 плоскостей (англ. planes) по 216 (65 536) символов. Нулевая плоскость (англ. plane 0) называется базовой (англ. basic) и содержит символы наиболее употребительных письменностей. Остальные плоскости — дополнительные (англ. supplementary). Первая плоскость (англ. plane 1) используется, в основном, для исторических письменностей, вторая (англ. plane 2) — для редко используемых иероглифов китайского письма (ККЯ), третья (англ. plane 3) зарезервирована для архаичных китайских иероглифов[31]. Плоскости 15 и 16 выделены для частного употребления[7].
Для обозначения символов Unicode используется запись вида «U+xxxx» (для кодов 0…FFFF), или «U+xxxxx» (для кодов 10000…FFFFF), или «U+xxxxxx» (для кодов 100000…10FFFF), где xxx — шестнадцатеричные цифры. Например, символ «я» (U+044F) имеет код 044F16 = 110310.
Плоскости Юникода | ||
---|---|---|
Плоскость | Название | Диапазон символов |
0 | Базовая многоязыковая плоскость (Basic multilingual plane, BMP) | U+0000…U+FFFF |
1 | Дополнительная многоязыковая плоскость (Supplementary multilingual plane, SMP) | U+10000…U+1FFFF |
2 | Дополнительная иероглифическая плоскость (Supplementary ideographic plane, SIP) | U+20000…U+2FFFF |
3 | Третичная иероглифическая плоскость (Tertiary ideographic plane, TIP) | U+30000…U+3FFFF |
4-13 | не используются | U+40000…U+DFFFF |
14 | Дополнительная плоскость особого назначения (Supplementary special-purpose plane, SSP) | U+E0000…U+EFFFF |
15-16 | Дополнительные области для частного использования (Supplementary private use area, SPUA-A/B) | U+F0000…U+10FFFF |
Универсальная система кодирования (Юникод) представляет собой набор графических символов и способ их кодирования для компьютерной обработки текстовых данных.
Графические символы — это символы, имеющие видимое изображение. Графическим символам противопоставляются управляющие символы и символы форматирования.
Графические символы включают в себя следующие группы:
Юникод — это система для линейного представления текста. Символы, имеющие дополнительные над- или подстрочные элементы, могут быть представлены в виде построенной по определённым правилам последовательности кодов (составной вариант, composite character) или в виде единого символа (монолитный вариант, precomposed character). На данный момент (2014) считается, что все буквы крупных письменностей в Юникод внесены, и если символ доступен в составном варианте, дублировать его в монолитном виде не нужно.
Консорциум не создаёт нового, а констатирует сложившийся порядок вещей [32]. Например, картинки «эмодзи» были добавлены потому, что японские операторы мобильной связи широко их использовали. Для этого добавление символа проходит через сложный процесс [32]. И, например, символ рубля прошёл его за три месяца просто потому, что до этого шесть лет широко использовался.
Товарные знаки кодируют только в порядке исключения. Так, в Юникоде нет флага Windows или яблока Apple.
Как только символ появился в кодировке, он никогда не сдвинется и не исчезнет. Если же потребуется изменить порядок символов, это делается не переменой позиций, а национальным порядком сортировки. Есть и другие, более тонкие гарантии стабильности — например, не будут меняться таблицы нормализации [33].
Один и тот же символ может иметь несколько форм; в Юникод эти формы входят одной кодовой позицией:
С другой стороны, если исторически в шрифтах были две разных кодовых позиции, они остаются разными и в Юникоде. Строчная греческая сигма имеет две формы, и они — разные позиции. А с кружком и знак ангстрема, греческое мю и латинское «микро-» — разные символы.
Конечно же, похожие символы в неродственных письменностях ставятся в разные кодовые позиции. Например, буква «А» в латинице, кириллице, греческом и чероки — разные символы.
Крайне редко один и тот же символ ставится в две разные кодовые позиции для упрощения обработки текста. Математический штрих и такой же штрих для индикации мягкости звуков — разные символы, второй считается буквой.
Графические символы в Юникоде подразделяются на протяжённые и непротяжённые (бесширинные). Непротяжённые символы при отображении не занимают места в строке. К ним относятся, в частности, знаки ударения и прочие диакритические знаки. Как протяжённые, так и непротяжённые символы имеют собственные коды. Протяжённые символы иначе называются базовыми (англ. base characters), а непротяжённые — модифицирующими (англ. combining characters); причём последние не могут встречаться самостоятельно. Например, символ «á» может быть представлен как последовательность базового символа «a» (U+0061) и модифицирующего символа « ́» (U+0301) или как монолитный символ «á» (U+00C1).
Особый тип модифицирующих символов — селекторы варианта начертания (англ. variation selectors). Они действуют только на те символы, для которых такие варианты определены. В версии 5.0 варианты начертания определены для ряда математических символов, для символов традиционного монгольского алфавита и для символов монгольского квадратного письма.
Поскольку одни и те же символы можно представить различными кодами сравнение строк байт за байтом становится невозможным. Алгоритмы нормализации (англ. normalization forms) решают эту проблему, выполняя приведение текста к определённому стандартному виду. Приведение осуществляется путём замены символов на эквивалентные с использованием таблиц и правил. «Декомпозицией» называется замена (разложение) одного символа на несколько составляющих символов, а «композицией», наоборот, — замена (соединение) нескольких составляющих символов на один символ.
В стандарте Юникода определены 4 алгоритма нормализации текста: NFD, NFC, NFKD и NFKC.
NFD, англ. normalization form D («D» от англ. decomposition), форма нормализации D — каноническая декомпозиция — алгоритм, согласно которому выполняется рекурсивная замена монолитных символов (англ. precomposed characters) на несколько составных (англ. composite characters) в соответствии с таблицами декомпозиции.
Примеры:
|
→ |
|
|
|
→ |
|
|
|
|
→ |
|
|
|
|
→ |
|
|
|
NFC, англ. normalization form C («C» от англ. composition), форма нормализации C — алгоритм, согласно которому последовательно выполняются каноническая декомпозиция и каноническая композиция. Сначала каноническая декомпозиция (алгоритм NFD) приводит текст к форме D. Затем каноническая композиция — операция, обратная NFD, обрабатывает текст от начала к концу с учётом следующих правил:
S
считается начальным, если имеет класс модификации равный нулю согласно таблице символов Юникода;S
, символ C
блокируется от S
, только если между S
и C
есть какой-либо символ B
, который либо является начальным, либо имеет одинаковый или больший класс модификации, чем C
. Это правило распространяется только на строки, прошедшие каноническую декомпозицию;X
может быть первично совмещён с символом Y
, если и только если существует первичный композит Z
, канонически эквивалентный последовательности <X
, Y
>;C
не блокируется последним встреченным начальным базовым символом L
и он может быть успешно первично совмещён с ним, то L
заменяется на композит L-C
, а C
удаляется.Пример:
|
|
→ |
|
NFKD, англ. normalization form KD, форма нормализации KD — совместимая декомпозиция — алгоритм, согласно которому последовательно выполняются каноническая декомпозиция и замены символов текста по таблицам совместимой декомпозиции. Таблицы совместимой декомпозиции предусматривают замену на почти эквивалентные символов[35]:
Примеры:
|
→ |
|
|
→ |
|
|
→ |
|
|
→ |
|
|
→ |
|
|
→ |
|
|
→ |
|
NFKC, англ. normalization form KC, форма нормализации KC — алгоритм, согласно которому последовательно выполняются совместимая декомпозиция (алгоритм NFKD) и каноническая композиция (алгоритм NFC).
Исходный текст | NFD | NFC | NFKD | NFKC | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
Стандарт Юникод поддерживает письменности языков как с направлением написания слева направо (англ. left-to-right, LTR), так и с написанием справа налево (англ. right-to-left, RTL) — например, арабское и еврейское письмо. В обоих случаях символы хранятся в «естественном» порядке; их отображение с учётом нужного направления письма обеспечивается приложением.
Кроме того, Юникод поддерживает комбинированные тексты, сочетающие фрагменты с разным направлением письма. Данная возможность называется двунаправленность (англ. bidirectional text, BiDi). Некоторые упрощённые обработчики текста (например, в сотовых телефонах) могут поддерживать Юникод, но не иметь поддержки двунаправленности. Все символы Юникода поделены на несколько категорий: пишущиеся слева направо, пишущиеся справа налево, и пишущиеся в любом направлении. Символы последней категории (в основном это знаки пунктуации) при отображении принимают направление окружающего их текста.
Юникод включает практически все современные письменности, в том числе:
и другие.
С академическими целями добавлены многие исторические письменности, в том числе: германские руны, древнетюркские руны, древнегреческая, египетские иероглифы, клинопись, письменность майя, этрусский алфавит.
В Юникоде представлен широкий набор математических и музыкальных символов, а также пиктограмм.
В Юникод принципиально не включаются государственные флаги, логотипы компаний и продуктов, хотя они и встречаются в шрифтах (например, логотип Apple в кодировке MacRoman (0xF0) или логотип Windows в шрифте Wingdings (0xFF)). В юникодовских шрифтах логотипы должны размещаться только в области пользовательских символов.
Консорциум Юникода работает в тесной связи с рабочей группой ISO/IEC/JTC1/SC2/WG2, которая занимается разработкой международного стандарта 10646 (ISO/IEC 10646). Между стандартом Юникода и ISO/IEC 10646 установлена синхронизация, хотя каждый стандарт использует свою терминологию и систему документации.
Сотрудничество Консорциума Юникода с Международной организацией по стандартизации (англ. International Organization for Standardization, ISO) началось в 1991 году. В 1993 году ISO выпустила стандарт DIS 10646.1. Для синхронизации с ним Консорциум утвердил стандарт Юникода версии 1.1, в который были внесены дополнительные символы из DIS 10646.1. В результате значения закодированных символов в Unicode 1.1 и DIS 10646.1 полностью совпали.
В дальнейшем сотрудничество двух организаций продолжилось. В 2000 году стандарт Unicode 3.0 был синхронизирован с ISO/IEC 10646-1:2000. Предстоящая третья версия ISO/IEC 10646 будет синхронизирована с Unicode 4.0. Возможно, эти спецификации даже будут опубликованы как единый стандарт.
Аналогично форматам UTF-16 и UTF-32 в стандарте Юникода, стандарт ISO/IEC 10646 также имеет две основные формы кодирования символов: UCS-2 (2 байта на символ, аналогично UTF-16) и UCS-4 (4 байта на символ, аналогично UTF-32). UCS значит универсальный многооктетный (многобайтовый) кодированный набор символов (англ. universal multiple-octet coded character set). UCS-2 можно считать подмножеством UTF-16 (UTF-16 без суррогатных пар), а UCS-4 является синонимом для UTF-32.
Отличия стандартов Юникод и ISO/IEC 10646:
Юникод имеет несколько форм представления (RFC 4042).
В Microsoft Windows NT и основанных на ней системах Windows 2000 и Windows XP в основном используется форма UTF-16LE. В UNIX-подобных операционных системах GNU/Linux, BSD и Mac OS X принята форма UTF-8 для файлов и UTF-32 или UTF-8 для обработки символов в оперативной памяти.
Punycode — другая форма кодирования последовательностей Unicode-символов в так называемые ACE-последовательности, которые состоят только из алфавитно-цифровых символов, как это разрешено в доменных именах.
UTF-8 — представление Юникода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими 8-битные символы. Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байт (на деле, только до 4 байт, поскольку в Юникоде нет символов с кодом больше 10FFFF, и вводить их в будущем не планируется), в которых первый байт всегда имеет вид 11xxxxxx
, а остальные — 10xxxxxx
. В UTF-8 не используются суррогатные пары, 4-x байтов достаточно для записи любого символа юникода.
Формат UTF-8 был изобретён RFC 3629 и ISO/IEC 10646 Annex D.
Символы UTF-8 получаются из Unicode следующим образом:
Unicode UTF-8: 0x00000000 — 0x0000007F: 0xxxxxxx 0x00000080 — 0x000007FF: 110xxxxx 10xxxxxx 0x00000800 — 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 0x00010000 — 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Теоретически возможны, но не включены в стандарт также:
0x00200000 — 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0x04000000 — 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
Несмотря на то, что UTF-8 позволяет указать один и тот же символ несколькими способами, только наиболее короткий из них правильный. Остальные формы должны отвергаться по соображениям безопасности.
В потоке данных UTF-16 младший байт может записываться либо перед старшим (англ. UTF-16 little-endian), либо после старшего (англ. UTF-16 big-endian). Аналогично существует два варианта четырёхбайтной кодировки — UTF-32LE и UTF-32BE.
Для определения формата представления Юникода в начало текстового файла записывается сигнатура — символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый маркером последовательности байтов (англ. byte order mark (BOM)). Это позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует. Также этот способ иногда применяется для обозначения формата UTF-8, хотя к этому формату и неприменимо понятие порядка байтов. Файлы, следующие этому соглашению, начинаются с таких последовательностей байтов:
К сожалению, этот способ не позволяет надёжно различать UTF-16LE и UTF-32LE, поскольку символ U+0000 допускается Юникодом (хотя реальные тексты редко начинаются с него).
Файлы в кодировках UTF-16 и UTF-32, не содержащие BOM, должны иметь порядок байтов big-endian (unicode.org).
Внедрение Юникода привело к изменению подхода к традиционным 8-битным кодировкам. Если раньше кодировка задавалась шрифтом, то теперь она задаётся таблицей соответствия между данной кодировкой и Юникодом. Фактически 8-битные кодировки превратились в форму представления некоторого подмножества Юникода. Это намного упростило создание программ, которые должны работать с множеством разных кодировок: теперь, чтобы добавить поддержку ещё одной кодировки, надо всего лишь добавить ещё одну таблицу перекодировки в Юникод.
Кроме того, многие форматы данных позволяют вставлять любые символы Юникода, даже если документ записан в старой 8-битной кодировке. Например, в HTML можно использовать коды с амперсандом.
Большинство современных операционных систем в той или иной степени обеспечивают поддержку Юникода.
В операционных системах семейства Windows NT для внутреннего представления имён файлов и других системных строк используется двухбайтовая кодировка UTF-16LE. Системные вызовы, принимающие строковые параметры, существуют в однобайтном и двухбайтном вариантах. Подробнее см. в статье Юникод в операционных системах Microsoft.
UNIX-подобные операционные системы, в том числе GNU/Linux, BSD, Mac OS X, используют для представления Юникода кодировку UTF-8. Большинство программ могут работать с UTF-8 как с традиционными однобайтными кодировками, не обращая внимания на то, что символ представляется как несколько последовательных байт. Для работы с отдельными символами строки обычно перекодируются в UCS-4, так что каждому символу соответствует машинное слово.
Одной из первых успешных коммерческих реализаций Юникода стала среда программирования Java. В ней принципиально отказались от 8-битного представления символов в пользу 16-битного. Это решение увеличивало расход памяти, но позволило вернуть в программирование важную абстракцию: произвольный одиночный символ (тип char
). В частности, программист мог работать со строкой, как с простым массивом. К сожалению, успех не был окончательным, Юникод перерос ограничение в 16 бит и к версии J2SE 5.0 произвольный символ снова стал занимать переменное число единиц памяти — один char
или два (см. суррогатная пара).
Сейчас большинство языков программирования поддерживают строки Юникода, хотя их представление может различаться в зависимости от реализации.
Поскольку ни одна раскладка клавиатуры не может позволить вводить все символы Юникода одновременно, от операционных систем и прикладных программ требуется поддержка альтернативных методов ввода произвольных символов Юникода.
Хотя начиная с Windows 2000, служебная программа «Таблица символов» (charmap.exe) поддерживает юникодные символы и позволяет копировать их в буфер обмена, но эта поддержка ограничена только базовой плоскостью (коды символов U+0000-U+FFFF). Символы с кодами от U+10000 «Таблица символов» не отображает.
Похожая таблица есть, например, в Microsoft Word.
Иногда можно набрать шестнадцатеричный код, нажать Alt+X, и код будет заменён на соответствующий символ, например, в WordPad, Microsoft Word. В редакторах Alt+X выполняет и обратное преобразование.
Во многих программах MS Windows, чтобы получить символ Unicode, нужно при нажатой клавише Alt набрать десятичное значение кода символа на цифровой клавиатуре. Например, полезными при наборе кириллических текстов будут комбинации Alt+0171 («), Alt+0187 (») и Alt+0769 (знак ударения). Интересны также комбинации Alt+0133 (…) и Alt+0151 (—).
В Mac OS 8.5 и более поздних версиях поддерживается метод ввода, называемый «Unicode Hex Input». При зажатой клавише Option требуется набрать четырёхзначный шестнадцатеричный код требуемого символа. Этот метод позволяет вводить символы с кодами, большими U+FFFF, используя пары суррогатов; такие пары операционной системой будут автоматически заменены на одиночные символы. Этот метод ввода перед использованием нужно активизировать в соответствующем разделе системных настроек и затем выбрать как текущий метод ввода в меню клавиатуры.
Начиная с Mac OS X 10.2, существует также приложение «Character Palette», позволяющее выбирать символы из таблицы, в которой можно выделять символы определённого блока или символы, поддерживаемые конкретным шрифтом.
В GNOME также есть утилита «Таблица символов» (gucharmap), позволяющая отображать символы определённого блока или системы письма и предоставляющая возможность поиска по названию или описанию символа. Когда код нужного символа известен, его можно ввести в соответствии со стандартом ISO 14755: при зажатых клавишах Ctrl+⇧ Shift ввести шестнадцатеричный код (начиная с некоторой версии GTK+, ввод кода нужно предварить нажатием клавиши «U»). Вводимый шестнадцатеричный код может иметь до 32 бит в длину, позволяя вводить любые символы Юникода без использования суррогатных пар.
Все приложения X Window, включая GNOME и KDE, поддерживают ввод при помощи клавиши Compose. Для клавиатур, на которых нет отдельной клавиши Compose, для этой цели можно назначить любую клавишу — например, ⇪ Caps Lock.
Консоль GNU/Linux также допускает ввод символа Юникода по его коду — для этого десятичный код символа нужно ввести цифрами расширенного блока клавиатуры при зажатой клавише Alt. Можно вводить символы и по их шестнадцатеричному коду: для этого нужно зажать клавишу AltGr, и для ввода цифр A—F использовать клавиши расширенного блока клавиатуры от NumLock до ↵ Enter (по часовой стрелке). Поддерживается также и ввод в соответствии с ISO 14755. Для того чтобы перечисленные способы могли работать, нужно включить в консоли режим Юникода вызовом unicode_start
(1) и выбрать подходящий шрифт вызовом setfont
(8).
Mozilla Firefox для Linux поддерживает ввод символов по ISO 14755.
В Юникоде английское «a» и польское «a» — один и тот же символ. Точно так же одним символом (но отличающимся от «a» латинского) считаются русское «а» и сербское «а». Такой принцип кодирования не универсален; по-видимому, решения «на все случаи жизни» вообще не может существовать.
Некоторые недостатки связаны не с самим Юникодом, а с возможностями обработчиков текста.
Некоторые редкие системы письма всё ещё не представлены должным образом в Юникоде. Изображение «длинных» надстрочных символов, простирающихся над несколькими буквами, как, например, в церковнославянском языке, пока не реализовано.
«Unicode» — одновременно и имя собственное (или часть имени, например, Unicode Consortium), и имя нарицательное, происходящее из английского языка.
На первый взгляд предпочтительнее использовать написание «Уникод». В русском языке уже есть морфемы «уни-» (слова с латинским элементом «uni-» традиционно переводились и писались через «уни-»: универсальный, униполярный, унификация, униформа) и «код». Напротив, торговые марки, заимствованные из английского языка, обычно передаются посредством практической транскрипции, в которой деэтимологизированное сочетание букв «uni-» записывается в виде «юни-» («Юнилевер», «Юникс» и т. п.), то есть точно так же, как в случае с побуквенными сокращениями, вроде UNICEF «United Nations International Children’s Emergency Fund» — ЮНИСЕФ.
Написание «Юникод» уже твёрдо вошло в русскоязычные тексты. В Википедии используется более распространённый вариант. В MS Windows используется вариант «Юникод».
На сайте Консорциума есть специальная страница, где рассматриваются проблемы передачи слова «Unicode» в различных языках и системах письма. Для русской кириллицы указан вариант «Юникод»[1].
Формы, принятые иностранными организациями для русской передачи слова «Unicode», являются рекомендательными.
Юникод.