Юникод

Материал из Википедии — свободной энциклопедии
(перенаправлено с «UCS-2»)
Перейти к навигации Перейти к поиску
Логотип Консорциума Юникода

Юнико́д<ref name=autogenerated1>Шаблон:Cite web</ref> (англ. Шаблон:Lang-en2) — стандарт кодирования символов, включающий в себя знаки почти всех письменных языков мира<ref name="unicode-techintro">Шаблон:Cite web</ref>. В настоящее время стандарт является преобладающим в Интернете.

Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. Шаблон:Lang-en2)<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>. Применение этого стандарта позволяет закодировать очень большое число символов из разных систем письменности: в документах, закодированных по стандарту Юникод, могут соседствовать китайские иероглифы, математические символы, буквы греческого алфавита, латиницы и кириллицы, символы музыкальной нотной нотации, при этом становится ненужным переключение кодовых страниц<ref name="unicode-foreword">Шаблон:Cite web</ref>.

Стандарт состоит из двух основных частей: универсального набора символов (англ. Шаблон:Lang-en2) и семейства кодировок (англ. Шаблон:Lang-en2). Универсальный набор символов перечисляет допустимые по стандарту Юникод символы и присваивает каждому символу код в виде неотрицательного целого числа, записываемого обычно в шестнадцатеричной форме с префиксом U+, например, U+040F. Семейство кодировок определяет способы преобразования кодов символов для передачи в потоке или в файле.

Коды в стандарте Юникод разделены на несколько областей. Область с кодами от U+0000 до U+007F содержит символы набора ASCII, и коды этих символов совпадают с их кодами в ASCII. Далее расположены области символов других систем письменности, знаки пунктуации и технические символы. Часть кодов зарезервирована для использования в будущем<ref name='unicode-02'>Шаблон:Cite web</ref>. Под символы кириллицы выделены области знаков с кодами от U+0400 до U+052F, от U+2DE0 до U+2DFF, от U+A640 до U+A69F (см. Кириллица в Юникоде)<ref>Шаблон:Cite web</ref>.

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

Шаблон:Цитата К концу 1980-х годов стандартом стали 8-битные кодировки, их существовало уже большое множество, и постоянно появлялись новые. Это объяснялось как расширением круга поддерживаемых языков, так и стремлением создавать кодировки, частично совместимые между собой (характерный пример — появление альтернативной кодировки для русского языка, обусловленное эксплуатацией западных программ, созданных для кодировки CP437). В результате появилось несколько проблем:

  1. проблема неправильной раскодировки;
  2. проблема ограниченности набора символов;
  3. проблема преобразования одной кодировки в другую;
  4. проблема дублирования шрифтов.

Проблема неправильной раскодировки вызывала появление в документе символов иностранных языков, не предполагавшихся в документе, или появление не предполагавшихся псевдографических символов, прозванных русскоязычными пользователями «кракозябрами». Проблема во многом была вызвана отсутствием стандартизированной формы указания кодировки для файла или потока. Проблему можно было решить либо последовательным внедрением стандарта указания кодировки, либо внедрением общей для всех языков кодировки.<ref name='unicode-foreword' />

Проблема ограниченности набора символов<ref name='unicode-foreword' />. Проблему можно было решить либо переключением шрифтов внутри документа, либо внедрением «широкой» кодировки. Переключение шрифтов издавна практиковалось в текстовых процессорах, причём часто использовались шрифты с нестандартной кодировкой, т. н. «dingbat fonts». В итоге при попытке переноса документа в другую систему все нестандартные символы превращались в «кракозябры».

Проблема преобразования одной кодировки в другую. Проблему можно было решить либо составлением таблиц перекодировки для каждой пары кодировок, либо использованием промежуточного преобразования в третью кодировку, включающую все символы всех кодировок<ref>Шаблон:Cite web</ref>.

Проблема дублирования шрифтов. Для каждой кодировки создавался свой шрифт, даже если наборы символов в кодировках совпадали частично или полностью. Проблему можно было решить путём создания «больших» шрифтов, из которых впоследствии выбирались бы нужные для данной кодировки символы. Однако это требовало создания единого реестра символов, чтобы определять, чему что соответствует.

Была признана необходимость создания единой «широкой» кодировки. Кодировки с переменной длиной символа, широко использующиеся в Восточной Азии, были признаны слишком сложными в использовании, поэтому было решено использовать символы фиксированной ширины. Использование 32-битных символов казалось слишком расточительным, поэтому было решено использовать 16-битные.

Первая версия Юникода представляла собой кодировку с фиксированным размером символа в 16 бит, то есть общее число кодов было 216 (65 536). С тех пор символы стали обозначать четырьмя шестнадцатеричными цифрами (например, U+04F0). При этом в Юникоде планировалось кодировать не все существующие символы, а только те, которые необходимы в повседневном обиходе. Редко используемые символы должны были размещаться в «области пользовательских символов» ({{#if:en|{{#if:|{{{зачин}}} }}{{#if:||{{#switch:en |ab=абхазск. |abq=абазинск. |af=африкаанс |akk=аккадск. |akz=алабама |ale=алеутск. |als=тоскск. |am=амхарск. |an=арагонск. |ang=др.-англ. |ani=андийск. |ar=арабск. |arc=арамейск. |av=аварск. |ae|ave=авест. |awd=аравакск. |az=азерб. |eu=баскск. |ba=башк. |bar=бав. |be=белор. |ber=берберск. |bg=болг. |bn=бенг. |bo=тибетск. |br=брет. |bs=босн. |bua=бурятск. |ca=каталанск. |ce=чеченск. |cel=галльск. |cel-pro=пракельт. |ch=чам. |chm=мар. |cho=чокт. |chu-ru=русск.-церк.-слав. |chu-sr=сербск.-церк.-слав. |chu-bg=болг.-церк.-слав. |cjs=шорск. |ckt=чук. |co=корс. |crh=кр.-тат. |cs=чешск. |csb=кашубск. |cu=ст.-слав. |cv=чувашск. |cy=валл. |da=датск. |dar=дарг. |ddo=цезск. |de=нем. |dsb=н.-луж. |dty=дотели |dum=ср.-нидерл. |egy=егип. |el=греч. |en=англ. |enm=ср.-англ. |eo=эспер. |es=исп. |et=эст. |ett=этрусск. |fa=перс. |fi=финск. |fo=фарерск. |fr=франц. |frk=др.-франкск. |frm=ср.-франц. |fro=ст.-франц. |frr=сев.-фризск. |fry=зап.-фризск. |fur=фриульск. |fy=фризск. |ga=ирл. |gag=гагаузск. |gd=гэльск. |gdo=годобер. |gem=прагерм. |gez=древнеэфиопск. |gin=гинухск. |gkm=ср.-греч. |gl=галис. |gmh=ср.-в.-нем. |gml=ср.-н.-нем. |gmy=микен. |gn=гуарани |goh=др.-в.-нем. |got=готск. |grc=др.-греч. |grc-pro|grk-pro=протогреч. |gsw=алеманнск. |gu=гуджарати |ha=хауса |haw=гавайск. |hbo=др.-евр. |hbs=сербохорв. |he=ивр. |hi=хинд. |hit=хетт. |hr=хорв. |hsb=в.-луж. |ht=гаит. |hu=венг. |hy=армянск. |id=индон. |inh=ингушск. |is=исл. |it=итал. |itl=ительм. |iu=инукт. |ja=яп. |jv=яванск. |ka=груз. |kaa=каракалп. |kas=кашм. |kg=конго |kik=кикуйю |kjh=хакас. |kk=казахск. |kky=кууку-йимитирск. |kl=гренландск. |kn=канн. |ko=корейск. |kom=коми-зыр. |koi=коми-перм. |krc=карач.-балк. |krl=карельск. |kum=кумыкск. |ky=кирг. |la=лат. |lad=сефардск. |lb=люксемб. |lez=лезг. |liv=лив. |lmo=ломбардск. |lng=лангобардск. |lo=лаосск. |lt=лит. |ltg=латг. |lv=латышск. |mad=мадурск. |mdf=мокш. |mg=малаг. |mga=ср.-ирл. |mi=маори |mic=микмакск. |mk=макед. |mn=монг. |mnc=маньчжурск. |mns=мансийск. |mnw=монск. |ms=малайск. |mt=мальтийск. |myv=эрзянск. |myz=мандейск. |na=науру |nah=науатль |niv=нивх. |nds=нж.-нем. |ne=непали |nl=нидерл. |no=норв. |non=др.-сканд. |nuk=нутка |oc=прованс. |ojp=ст.-яп. |orv=др.-русск. |os=осет. |osp=ст.-исп. |osx=др.-сакс. |ota=османск. |otk=др.-тюрк. |pa=пендж. |pap=папьям. |pcd=пикардск. |pdc=пенсильв.-нем. |peo=др.-перс. |phn=финик. |pi=пали |pie=праиндоевр. |pl=польск. |pox=полабск. |ppol=праполинез. |pro=ст.-оксит. |prg=др.-прусск. |pt=порт. |pt-BR=браз.-порт. |qu=кечуа |rm=ретором. |ro=рум. |roa-nor=нормандск. |rom=цыганск. |ru=русск. |rw=киньяруанда |sa=санскр. |sah=якутск. |sc=сард. |scn=сицил. |sco=скотс. |se=северносаамск. |see=сенека |sga=др.-ирл. |sh=сербохорв. |shh=шошонск. |sjd=кильдин-саамск. |sjt=терско-саамск. |sk=словацк. |sl=словенск. |sla-pro=праслав. |smi-pro=прасаамск. |smn=инари-саамск. |sms=коллта-саамск. |sqi|sq=алб. |sr=сербск. |sux=шумерск. |sv=шведск. |sw=суах. |syc=сирийск. |syd=самодийск. |ta=там. |tab=табасаранск. |tg=тадж. |th=тайск. |tin=тинд. |tk=туркм. |tl=тагальск. |tn=тсвана |tnq=таино |tpn=тупи |tr=тур. |trk=тюрк. |tt=тат. |ttt=татск. |txb=тохар. B |ty=таитянск. |tyv=тувинск. |udm=удм. |ug=уйгурск. |uga=угаритск. |uk=укр. |ur=урду |urj-pro=прауральск. |uz=узб. |vec=венет. |vi=вьетн. |vot=водск. |vsn=др.-инд. |xas=камас. |xal=калм. |xcl=грабар |xh=коса |xil=иллир. |xld=лидийск. |xmf=мегр. |xno=англ.-норм. |xpr=парфянск. |xpu=пуническ. |xto=тохар. A |yi=идиш |yrk=ненецк. |zh=кит. |zu=зулусск. |en.}}}}}}{{#if:private use area|{{#if:en|{{#if:|| }}}}Шаблон:Aslinks{{#if:|Ошибка скрипта: Модуля «string» не существует.}}}}{{#if:| }}{{#if:| «{{{3}}}{{#if:|, {{{4}}}}}{{#if:|, {{{5}}}}}»}}{{#if:| ({{{comment}}})}}{{#if:|}}{{#if:|Шаблон:Категория}}{{#if:|Шаблон:Категория}}{{#if:|Шаблон:Категория}}), которая первоначально занимала коды U+D800…U+F8FF. Чтобы использовать Юникод также и в качестве промежуточного звена при преобразовании разных кодировок друг в друга, в него включили все символы, представленные во всех наиболее известных кодировках.

В дальнейшем, однако, было принято решение кодировать все символы и в связи с этим значительно расширить кодовую область. Одновременно с этим коды символов стали рассматриваться не как 16-битные значения, а как абстрактные числа, которые в компьютере могут представляться множеством разных способов (см. способы представления).

Поскольку в ряде компьютерных систем (например, Windows NT<ref name="windows-nt">Шаблон:Cite web</ref>) фиксированные 16-битные символы уже использовались в качестве кодировки по умолчанию, было решено все наиболее важные знаки кодировать только в пределах первых 65 536 позиций (так называемая англ. Шаблон:Lang-en2). Остальное пространство используется для «дополнительных символов» (англ. Шаблон:Lang-en2): систем письма вымерших языков или очень редко используемых китайских иероглифов, математических и музыкальных символов.

Для совместимости со старыми 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.

Юникод является самой распространённой кодировкой в веб-секторе с 2008 года<ref>Шаблон:Cite web</ref>. На конец 2024 года доля веб-сайтов, использующих Юникод, составила около 98,3 %<ref>Шаблон:Cite web</ref>.

Версии Юникода

Работа по доработке стандарта продолжается. Новые версии выпускаются по мере изменения и пополнения таблиц символов. Параллельно выпускаются новые документы ISO/IEC 10646.

Первый стандарт выпущен в 1991 году, последней на данный момент версией является 16.0.0 (10 сентября 2024)<ref>Шаблон:Cite web</ref>. Версии стандарта 1.0—5.0 публиковались как книги и имеют ISBN<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>.

Номер версии стандарта составлен из трёх цифр (например, 3.1.1). Третью цифру меняют при внесении в стандарт небольших изменений, не добавляющих новых символов (исключение — версия 1.0.1, в которой добавлены унифицированные идеограммы китайского, японского и корейского письма)<ref>Шаблон:Cite web</ref>.

База данных символов Юникода (Unicode Character Database) доступна для всех версий на официальном сайте как в простом текстовом, так и в XML-формате. Файлы распространяются под BSD-подобной лицензией<ref>Шаблон:Cite web</ref>.

Шаблон:Временная линия Юникода

Версии Юникода
Номер версии Дата публикации ISBN книги Издание ISO/IEC 10646 Количество пись­мен­но­стей<ref group="A">Включая единственный код (шрифт Брайля), единственную стенографическую систему (стенография Дюплойе), а также катакану, хирагану, жестовое письмо Саттон, исключая хэнтайгану (считается хираганой), два альтернативных грузинских алфавита (считаются грузинским), а также другие нетекстовые: четыре вида нот, черчение, математические знаки. Унифицированные системы (китайские и японские иероглифы; арабский, урду/шахмукхи, пегон и волофал…) считаются за одну; греческий и коптский до версии 4.1, когда их разунифицировали,— тоже. При дальнейшем обновлении данных: файл PropertyValueAliases.txt, раздел «sc», количество строк в этом разделе минус три (последние три — технические).</ref> Количество символов<ref group="A">Включая печатаемые (англ. Шаблон:Lang-en2), управляющие (англ. Шаблон:Lang-en2) и форматирующие (англ. Шаблон:Lang-en2) символы; не включая личные символы (англ. Шаблон:Lang-en2), несимвольные позиции (англ. Шаблон:Lang-en2), половины суррогатных пар (англ. Шаблон:Lang-en2), неофициально занятые (U+1D548 ажурное ℚ при официальном U+211A — используется, чтобы гарантированно набрать слово одним шрифтом; U+11C09 бхайкшуки начальное слоговое LL — в санскрите буква есть, но не найдена в источниках именно письмом бхайкшуки). Пресс-релизы Юникода дают цифру на 65 меньше — не учитывают управляющие (00…1F, 7F…9F). Стоит признать, что категория этих символов поначалу несколько раз менялась. При дальнейшем обновлении данных: количество заявленных символов + 65.</ref>
1.0.0<ref>Шаблон:Cite web</ref> Октябрь 1991 ISBN 0-201-56788-1 (Vol.1) 23 7161
Изначально Юникод содержал символы следующих письменностей: арабское письмо, армянское письмо, бенгальское письмо, чжуиньское письмо, кириллица, деванагари, грузинское письмо, греческое и коптское письмо, гуджарати, гурмукхи, хангыль, еврейское письмо, хирагана, каннада, катакана, лаосское письмо, латиница, малаялам, ория, тамильское письмо, телугу, тайское письмо и тибетское письмо<ref>Шаблон:Cite web</ref>
1.0.1 Июнь 1992 ISBN 0-201-60845-6 (Vol.2) 24 28 359
Добавлены 20 902 унифицированные идеограммы китайского, японского и корейского письма<ref>Шаблон:Cite web</ref>
1.1<ref>Шаблон:Cite web</ref> Июнь 1993 ISO/IEC 10646-1:1993 23 34 233
Добавлено 4306 слогов хангыля, дополнивших уже имеющиеся в кодировке 2350 символов. Удалены символы тибетского письма<ref>Шаблон:Cite web</ref>
2.0<ref>Шаблон:Cite web</ref> Июль 1996 ISBN 0-201-48345-9 ISO/IEC 10646-1:1993 и Amendments 5, 6, 7 24 38 950
Удалены добавленные ранее слоги хангыля, и добавлены 11 172 новых слога хангыля с новыми кодами. Возвращены удалённые ранее символы тибетского письма; символы получили новые коды и были размещены в разных таблицах. Введён механизм суррогатных (англ. Шаблон:Lang-en2) символов. Выделено место для плоскостей (англ. Шаблон:Lang-en2) 15 и 16<ref>Шаблон:Cite web</ref>
2.1<ref>Шаблон:Cite web</ref> Май 1998 ISO/IEC 10646-1:1993, Amendments 5, 6, 7, два символа из Amendment 18 24 38 952
Добавлены символ евро и заменяющий символ<ref>Шаблон:Cite web</ref>
3.0<ref>Шаблон:Cite web</ref> Сентябрь 1999 ISBN 0-201-61633-5 ISO/IEC 10646-1:2000 37 49 259
Добавлены письмо чероки, эфиопское письмо, кхмерское письмо, монгольские письменности, бирманское письмо, огамическое письмо, руны, сингальское письмо, сирийское письмо, тана, канадское слоговое письмо и письмо и, а также символы шрифта Брайля<ref>Шаблон:Cite web</ref>
3.1<ref>Шаблон:Cite web</ref> Март 2001 ISO/IEC 10646-1:2000

ISO/IEC 10646-2:2001

40 94 205
Добавлены дезеретское письмо, готское письмо и Шаблон:Iw, а также символы западной и византийской музыки, 42 711 унифицированных идеограмм китайского, японского и корейского письма. Выделено место для плоскостей 1, 2 и 14<ref>Шаблон:Cite web</ref>
3.2<ref>Шаблон:Cite web</ref> Март 2002 ISO/IEC 10646-1:2000 и Amendment 1

ISO/IEC 10646-2:2001

44 95 221
Добавлены письмо бухид, Шаблон:Iw, байбайин и письмо тагбанва<ref>Шаблон:Cite web</ref>
4.0<ref>Шаблон:Cite web</ref> Апрель 2003 ISBN 0-321-18578-1 ISO/IEC 10646:2003 51 96 447
Добавлены кипрское письмо, письмо лимбу, линейное письмо Б, сомалийское письмо, алфавит шоу, письмо лы и угаритское письмо, а также символы гексаграмм<ref>Шаблон:Cite web</ref>
4.1<ref>Шаблон:Cite web</ref> Март 2005 ISO/IEC 10646:2003 и Amendment 1 59 97 720
Добавлены письмо лонтара, глаголица, письмо кхароштхи, новое письмо лы, древнеперсидская клинопись, силхетское нагари и древнеливийское письмо. Символы коптского письма были отделены от символов греческого письма. Также добавлены символы старых греческих цифр, музыкальные символы Древней Греции и символ гривны (валюты Украины)<ref>Шаблон:Cite web</ref>
5.0<ref>Шаблон:Cite web</ref> Июль 2006 ISBN 0-321-48091-0 ISO/IEC 10646:2003, Amendments 1, 2, четыре символа из Amendment 3 64 99 089
Добавлены балийское письмо, клинопись, письмо нко, монгольское квадратное письмо и финикийское письмо<ref>Шаблон:Cite web</ref>
5.1<ref>Шаблон:Cite web</ref> Апрель 2008 ISO/IEC 10646:2003 и Amendments 1, 2, 3, 4 75 100 713
Добавлены карийское письмо, чамская письменность, письмо кая-ли, письмо лепча, ликийское письмо, лидийское письмо, письмо ол-чики, реджангское письмо, письмо саураштра, сунданское письмо, древнетюркское письмо и письмо ваи. Добавлены символы фестского диска, символы костей для маджонга и домино, заглавная буква эсцет (ẞ), а также буквы латиницы, использовавшиеся в средневековых рукописях для Шаблон:Iw. Новыми символами дополнен набор символов бирманского письма<ref>Шаблон:Cite web</ref>
5.2<ref>Шаблон:Cite web</ref> Октябрь 2009 ISO/IEC 10646:2003 и Amendments 1, 2, 3, 4, 5, 6 90 107 361
Добавлены авестийское письмо, письмо бамум, египетское иероглифическое письмо (по Шаблон:Iw, содержащему 1071 символ), имперское арамейское письмо, Шаблон:Iw, Шаблон:Iw, яванское письмо, письмо кайтхи, письмо лису, письмо манипури, южноаравийское письмо, древнетюркское письмо, самаритянское письмо, письмо ланна и письмо тай-вьет. Добавлены 4149 новых Шаблон:Iw (CJK-C), символы ведийского письма, символ тенге (валюты Казахстана), а также расширен набор символов чамо старого хангыля<ref>Шаблон:Cite web</ref>
6.0<ref>Шаблон:Cite web</ref> Октябрь 2010 ISO/IEC 10646:2010 и символ индийской рупии 93 109 449
Добавлены батакское письмо, письмо брахми, мандейское письмо. Добавлены символы игральных карт, дорожных знаков, географических карт, алхимии, эмотикона и эмодзи, а также 222 Шаблон:Iw (CJK-D)<ref>Шаблон:Cite web</ref>
6.1<ref>Шаблон:Cite web</ref> Январь 2012 ISO/IEC 10646:2012 100 110 181
Добавлены письмо чакма, мероитский курсив и мероитские иероглифы, письмо мяо, письмо шарада, Шаблон:Iw и письмо такри<ref>Шаблон:Cite web</ref>
6.2<ref>Шаблон:Cite web</ref> Сентябрь 2012 ISO/IEC 10646:2012 и символ турецкой лиры 100 110 182
Добавлен символ турецкой лиры (валюты Турции)<ref>Шаблон:Cite web</ref>
6.3<ref>Шаблон:Cite web</ref> Сентябрь 2013 ISO/IEC 10646:2012 и шесть символов 100 110 187
Добавлено пять символов для форматирования двунаправленного текста<ref>Шаблон:Cite web</ref>
7.0<ref>Шаблон:Cite web</ref> 16 июня 2014 ISO/IEC 10646:2012, Amendments 1, 2 и символ рубля 123 113 021
Добавлены письмо басса, агванское письмо, стенография Дюплойе, эльбасанское письмо, письмо грантха, Шаблон:Iw, Шаблон:Iw, линейное письмо А, Шаблон:Iw, манихейское письмо, письмо кикакуи, письмо моди, Шаблон:Iw, набатейское письмо, северноаравийское письмо, древнепермское письмо, письмо пахау, пальмирское письмо, Шаблон:Iw, Шаблон:Iw, сиддхаматрика, письмо тирхута, варанг-кшити и Шаблон:Iw, а также символ российского рубля и символ азербайджанского маната<ref>Шаблон:Cite web</ref>
8.0<ref>Шаблон:Cite web</ref> 17 июня 2015 ISO/IEC 10646:2014, Amendment 1, символ лари, 9 унифицированных идеограмм ККЯ, 41 эмодзи 129 120 737
Добавлены письмо ахом, анатолийские иероглифы, письмо хатран, письмо мултани, венгерские руны, SignWriting, 5776 Унифицированные идеограммы ККЯ — расширение E, строчные буквы письма чероки, буквы латиницы для немецкой диалектологии, 41 эмодзи, а также пять символов изменения цвета кожи для эмотиконов. Добавлен символ лари (валюты Грузии)<ref>Шаблон:Cite web</ref>
9.0<ref>Шаблон:Cite web</ref> 21 июня 2016 ISO/IEC 10646:2014, Amendments 1, 2, адлам, нева, японские символы для ТВ, 74 эмодзи и символов 135 128 237
Добавлены письмо адлам, письмо бхайкшуки, письмо марчен, письмо нева, письмо осейдж, тангутское письмо, а также 72 эмодзи и японские символы для телевидения<ref>Шаблон:Cite web</ref>
10.0<ref>Шаблон:Cite web</ref> 20 июня 2017 ISO/IEC 10646:2017, 56 эмодзи, 285 символов хэнтайганы, 3 символа квадратного письма Дзанабадзара 139 136 755
Добавлены квадратное письмо Дзанабадзара, письмо соёмбо, гонди Масарама, письмо нюй-шу, письмо хэнтайгана, 7494 Унифицированные идеограммы ККЯ — расширение F, а также 56 эмодзи и символ биткойна<ref>Шаблон:Cite web</ref>
11.0 Июнь 2018 ISO/IEC 10646:2017 146 137 439
Добавлены догра, грузинское письмо мтаврули, гунджалское гонди, ханифи, индийские цифры сийяк, макасарское письмо, медефайдрин, (древне-)согдийское письмо, цифры майя, 5 идеограмм ККЯ, символы сянци и половин звёздочек для оценки, а также 145 эмодзи, четыре символа изменения причёски для эмотиконов и символ копилефта<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>
12.0 Март 2019 ISO/IEC 10646:2017, Amendments 1, 2, а также 62 допол­ни­тель­ных символов 150 137 993
Добавлены элимайское письмо, Шаблон:Не переведено 3, хмонг, ванчо, дополнения для письма Полларда, малая кана для старых японских текстов, исторические дроби и символы тамильского письма, буквы лаосского письма для пали, буквы латиницы для транслитерации угаритского, управляющие символы форматирования египетских иероглифов, а также 61 эмодзи<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>
12.1 Май 2019 150 137 994
Экстренный выпуск: добавлен квадратный символ эпохи рэйва<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>
13.0 Март 2020 154 143 924
Добавлены хорезмийское письмо, письмо дивес акуру, малое киданьское письмо, езидское письмо, 4969 идеограмм ККЯ (включая 4939 Унифицированные идеограммы ККЯ — расширение G), а также 55 эмодзи, символы Creative Commons и символы для унаследованной вычислительной техники. Выделено место для плоскости 3<ref>Шаблон:Cite web</ref><ref>Шаблон:Cite web</ref>
14.0 Сентябрь 2021 159 144 762
Добавлены письмо тото, кипро-минойское письмо, виткутьское письмо, староуйгурское письмо, тангса, дополнительные буквы латиницы (блоки Расширенная латиница — F, Расширенная латиница — G) для использования в расширениях для МФА, добавление арабского письма для использования в языках Африки, Ирана, Пакистана, Малайзии, Индонезии, Явы и Боснии, а также дополнения для использования в Коране, другие дополнения для поддержки языков Северной Америки, Филиппин, Индии и Монголии, добавление символа сома, нотописи знаменного пения и 37 эмодзи.
15.0 Сентябрь 2022 161 149 251
Добавлены алфавит Нага для языка мундари (≈1950), кави (старояванский), кактовикские цифры, символы кириллицы для записи транскрипции, латинские буквы для записи языка малаялам, 3 лигатуры из турецкого Корана, 1 египетский иероглиф, символы для передачи затёртых египетских иероглифов, символы из джайнизма, звезда бахаизма, символы пяти транснептуновых объектов и 31 эмодзи (включая цвета кожи).
15.1 12 сентября 2023 161 149 878
Добавлены 897 иероглифов китайских имён, которые китайцы хотели расположить на плоскости 0A; 622 из них опознаны как новые. Также 5 символов структуры китайских иероглифов, 10 разных Шаблон:Нп5-последовательностей эмодзи и 18 последовательностей, изображающих людей, которые смотрят вправо (исключая цвета кожи).
16.0 10 сентября 2024 168 155 063
Добавлены почти 4000 египетских иероглифов, более 600 символов со старых компьютеров, новые письменности тулу<ref group="A">Древний тулу и близкую к нему систему письменности тигалари: от современного тулу отказались как из-за неустоявшейся системы (унифицируемой с малаяламом), так и из-за разного подхода к древнему и современному письму.</ref>, албанский Тодри, Шаблон:Iw (Сенегал), сунвар Джентича<ref group="A">Не путать с брахмийской абугидой тикамули, появившейся позже.</ref>, гурунг, кират, и ол-онал. 6 латинских символов для записи африканских и индейских языков, кириллическая буква ТЬ для ханты, арабские буквы из пегона и ливийского Корана, два комплекта бирманских цифр, две черты ККЯ, нукта из языка кави, египтологические стрелки. И всего 8 эмодзи, включая автоматически добавившийся остров Сарк (CQ).
17.0 9 сентября 2025 172 159 866
Добавлены более 4300 ККЯ-иероглифов. Письменности берия, сидетский, толонг-сики, тай-йо. Реформирован адлам. Шарада для современного кашмирского. Арабские лигатуры титулов, отброшенные в U14 за нехваткой источников. С новым словарём тангутского (2021) записали все его наработки. 27 меток произношения. Алфил и фарзин из прото-шахмат. Химические стрелки. Множество старых символов для астероидов, когда те в XIX веке начали открывать. Символы арабской геомантии. 7 односимвольных эмодзи. Последние многорасовые эмодзи — борцы и девушки Плейбоя. Решили, что будет танцевать бесполый танцор — современный балет. 10 символов со старых компьютеров разунифицированы с эмодзи. По ускоренной программе добавлен саудовский риял.
Примечания

<references group="A" />

Кодовое пространство

Хотя форма записи UTF-8 позволяет кодировать до 221 (2 097 152) кодовых позиций, было принято решение использовать лишь 1 112 064 для совместимости с UTF-16. Впрочем, этого в данный момент достаточно — в версии 17.0 используется всего Шаблон:Число и 172 Шаблон:Не переведено<ref>Шаблон:Cite web

Шаблон:Cite web

Шаблон:Cite web</ref>.

Кодовое пространство разбито на 17 плоскостей (англ. Шаблон:Lang-en2) по 216 (65 536) символов. Нулевая плоскость (Шаблон:Lang-en2) называется базовой (Шаблон:Lang-en2) и содержит символы наиболее употребительных письменностей. Остальные плоскости — дополнительные (Шаблон:Lang-en2). Первая плоскость (Шаблон:Lang-en2) используется в основном для исторических письменностей, вторая (Шаблон:Lang-en2) — для редко используемых иероглифов китайского письма (ККЯ), третья (Шаблон:Lang-en2) зарезервирована для архаичных китайских иероглифов<ref>Шаблон:Cite web</ref>. Плоскость 14 отведена для символов, используемых по особому назначению. Плоскости 15 и 16 выделены для частного употребления<ref name='unicode-02' />.

Для обозначения символов Unicode используется запись вида «U+xxxx» (для кодов 0…FFFF), или «U+xxxxx» (для кодов 10000…FFFFF), или «U+xxxxxx» (для кодов 100000…10FFFF), где xxx — шестнадцатеричные цифры. Например, символ «я» (U+044F) имеет код 044FШаблон:SubШаблон:Nbsp= 1103Шаблон:Sub.

Система кодирования

Универсальная система кодирования (Юникод) представляет собой набор графических символов и способ их кодирования для компьютерной обработки текстовых данных.

Графические или печатаемые символы — это символы, имеющие видимое изображение. Графическим символам противопоставляются управляющие и форматирующие символы.

Графические символы включают в себя следующие группы:

  • буквы, содержащиеся хотя бы в одном из обслуживаемых алфавитов;
  • цифры;
  • знаки пунктуации;
  • специальные знаки (математические, технические, идеограммы и пр.);
  • разделители;
  • диакритические метки, включая невидимые.

Юникод — это система для линейного представления текста. Символы, имеющие дополнительные над- или подстрочные элементы, могут быть представлены в виде построенной по определённым правилам последовательности кодов (составной вариант, composite character) или в виде единого символа (монолитный вариант, precomposed character). С 2014 года считается, что все буквы крупных письменностей в Юникод внесены, и если символ доступен в составном варианте, дублировать его в монолитном виде не нужно.

Общие принципы

Гарантии стабильности
Как только символ появился в кодировке, он не сдвинется и не исчезнет. Таким образом, каждый новый Юникод будет надмножеством старого. Если символ окажется плохим, его запрещают. Если же потребуется изменить порядок символов, это делается не переменой позиций, а национальным порядком сортировки. Есть и другие, более тонкие гарантии стабильности — например, не будут меняться таблицы нормализации<ref>Шаблон:Cite web</ref>.
Динамическая компоновка
Такой высокой цели, как универсальность, Юникод добивается путём динамической сборки печатного текста. Иногда для удобства делают и монолитные символы, но в целом Шаблон:Nobr.
Логический порядок
Символы в строке записываются приблизительно в порядке прочтения, в том числе в двунаправленном письме: арабский текст кодируется справа налево, а оказавшееся в нём европейское число — слева направо. Метка (умляут, огласовка…) идёт после основного символа. Есть исключения с визуальным порядком (например, лаосский).
Преобразуемость
Если в важной кодировке две формы одного символа закодированы разными позициями, это делает и Юникод. Преобразование не обязательно 1:1 — один символ другой кодировки может преобразоваться в несколько символов Юникода, и наоборот.
Простой текст
Юникод кодирует простой текст без оформления. Считается, что простой текст должен хранить достаточно данных, чтобы читаемо отобразить его, и больше ничего.
Семантика
Свойства символов задаются формально, с помощью формата CSV. Существует также версия в XML, неполная и на Юникод 16 её существование было под вопросом — но кто-то взялся поддерживать эту базу.
Символы, не глифы
Символ — единица смысла. Глиф — изображение, содержащееся в шрифте и выводящееся на экран/печать.
Так, в шрифте арабского стиля настали́к будут тысячи глифов. Но в кодировке около 200 символов стандартного арабского, передающих смысл. И наоборот, иногда (см. Унификация) разные символы могут иметь одинаковый глиф.
Нарушение этого принципа или историческое (σ≠ς, существовало ещё до принципа динамической компоновки), или вызвано сложностями шрифтов (Ţ≠Ț, последнее используется в молдавском и румынском).
Универсальность
Юникод разработан для людей разных языков и профессий: работающих в бизнесе, образовании, религии и науке, для современных и исторических текстов.
За пределами Юникода лежат:
  • письменности, про которые мало что известно, чтобы надёжно закодировать символы;
  • письменности, чьи пользователи не пришли к де-факто стандарту;
  • нетекстовые (например, пиктографические) письменности.
Унификация
Юникод старается не дублировать символы. Так, английская буква «вай», французская «игрек» и немецкая «ипсилон» — одна и та же кодовая позиция Y. Мало того, сходные иероглифы китайского и японского — одна кодовая позиция.
Существует несколько важных исключений. Сходные буквы разных письменностей кодируются разными кодовыми позициями. Часто позиции дублируются для упрощения обработки — так, в Юникоде три буквы Ð с разными строчными. Математический штрих и такой же штрих для индикации мягкости звуков — разные символы, второй считается буквой-модификатором. Преобразуемость может идти вразрез с унификацией — строчная греческая сигма имеет две разных формы, и они — разные кодовые позиции.
Эффективность
Юникод устроен так, чтобы эффективные реализации были осуществимы. Коды символов — последовательные числа от 0 до 10FFFF16, это позволяет иметь дело с таблицами поиска. UTF-8 и UTF-16 — самосинхронизирующиеся коды, а важнейшие символы доступны без раскодировки. Юникод избегает форматирующих символов, которые меняют внутреннее состояние. И многое другое.

Политика консорциума

Консорциум не создаёт нового, а констатирует сложившийся порядок вещей<ref name="emoji">Шаблон:Cite web</ref>. Например, картинки «эмодзи» были добавлены потому, что японские операторы мобильной связи широко их использовали. Для этого добавление символа проходит через сложный процесс<ref name="emoji" />. И, например, символ российского рубля прошёл его за три месяца, как только получил официальный статус, причём до этого он много лет де-факто использовался и его отказывались включить в Юникод.

Товарные знаки кодируют только в порядке исключения. Так, в Юникоде нет флага Windows или яблока Apple.

Эмодзи не вводятся в Юникод, если<ref>Шаблон:Cite web</ref>:

  • Понятие можно получить комбинацией имеющихся символов: «мыть руки» = «вода» + «руки». Белку часто изображают картинкой бурундука.
  • Понятие слишком специфическое: если на картинке японского блюда суши рисуют, например, суши с креветкой, то не стоит запрашивать другие виды суши.
  • Понятие может вызвать волну новых добавлений.
  • Флаги и надписи. Консорциум перестал включать такие эмодзи. Что является страной, а что нет, определяется стандартом ISO 3166-1, и флаги переносятся оттуда автоматически;
  • Картинка преходящая (например, вирус COVID-19). Некоторые производители рисуют вирус на месте эмодзи «микроорганизм».
  • Требуется закодировать конкретное изображение (например, интернет-мем).
  • Вариации направления движения: с Юникода 15.1 их понемногу вносят.

Специфичные для письменностей принципы

  • Письменности греческой группы (латиница и др.): формы, которые можно получить комбинированием, кодируются монолитно в качестве большого исключения.
  • Письменности брахмийской группы (деванагари и др.): спецсимвол «невидимая вирама» разунифицирован, чтобы автор шрифта прочитал стандарт и понял, что он делает. Палка данда кодируется как исключение, по умолчанию берётся данда из деванагари.
  • Египетские иероглифы поделены на три группы: базовые (>4400 штук), расширенные (встречаются в современных публикациях и не подтверждены, >500) и совместимые (символы из списка Гардинера, которые сегодня бы не закодировали, <100). Кодируются любые вариации, кроме размера, цвета и явно ухудшенного качества. Если один иероглиф закодирован в нескольких формах, некоторые могут выкинуть из базового списка. Иероглифы, которые можно получить комбинированием и поворотом, кодируются через спецсимволы. Но если такая комбинация имеет новый смысл (нож+нога = рана), то она получает право на отдельную кодовую позицию.
  • Эмодзи-человечки инклюзивны: закодированы бесполые, мужские и женские версии, в пяти цветах кожи. Некоторые предметы меняются под давлением инклюзивности: лейкопластырь перекрашен из телесного в белый. Чтобы избежать комбинаторного взрыва, убраны с «клавиатур» эмодзи семей. Эмодзи-колобки не инклюзивны.

Комбинирующие метки

Представление символа «Й» (U+0419) в виде базового символа «И» (U+0418) и комбинирующей метки « ̆» (U+0306)

Символы в Юникоде подразделяются на базовые (англ. Шаблон:Lang-en2) и комбинирующие (англ. Шаблон:Lang-en2). Метки обычно следуют за базовым символом и изменяют его отображение определённым образом. К комбинирующим символам, например, относятся диакритические знаки, знаки ударения. Например, русскую букву «Й» в Юникоде можно записать в виде базового символа «И» (U+0418) и комбинирующего символа « ̆» (U+0306), отображаемого над базовым.

Комбинирующие символы помечены в таблицах символов Юникода особыми категориями:

  • Nonspacing Mark — непротяжённая метка; таковые обычно отображаются над или под базовым символом и крайне редко раздвигают кегельную площадку символа (например, ï);
  • Enclosing Mark — охватывающая метка; эти метки охватывают символ со всех сторон и в идеале должны расширять его кегельную площадку;
  • Spacing Mark — протяжённая метка; представляет собой глиф перед или после основного символа, обладающий собственной кегельной площадкой.

Особый тип комбинирующих символов — селекторы варианта начертания (англ. Шаблон:Lang-en2). Они действуют только на те базовые символы, для которых такие варианты определены. К примеру, в версии Юникода 5.0 варианты начертания определены для ряда математических символов, для символов традиционного монгольского алфавита и для символов монгольского квадратного письма.

Алгоритмы нормализации

Из-за наличия в Юникоде комбинирующих символов одни и те же знаки письменности можно представить различными кодами. Так, например, букву «Й» в примере выше можно записать как отдельным символом, так и сочетанием базового и комбинированного. Из-за этого сравнение строк байт за байтом становится невозможным. Алгоритмы нормализации (англ. Шаблон:Lang-en2) решают эту проблему, выполняя приведение символов к определённому стандартному виду. Приведение осуществляется путём замены символов на эквивалентные с использованием таблиц и правил. «Декомпозицией» называется замена (разложение) одного символа на несколько составляющих символов, а «композицией», наоборот, — замена (соединение) нескольких составляющих символов на один символ.

В стандарте Юникода определены четыре алгоритма нормализации текста: NFD, NFC, NFKD и NFKC.

Шаблон:Якорь Каноническая декомпозиция (NFD)

NFD, англ. Шаблон:Lang-en2 («D» от англ. Шаблон:Lang-en2), форма нормализации D — каноническая декомпозиция — алгоритм, согласно которому выполняется рекурсивное разложение составных символов (англ. Шаблон:Lang-en2) на последовательность из одного или нескольких простых символов в соответствии с таблицами декомпозиции. Рекурсивное потому, что в процессе разложения составной символ может быть разложен на несколько других, некоторые из которых тоже являются составными, и к которым применяется дальнейшее разложение.

Примеры:

Ω
U+2126
Ω
U+03A9
Å
U+00C5
A
U+0041
̊
U+030A
U+1E69
s
U+0073
̣
U+0323
̇
U+0307
ḍ̇
U+1E0B U+0323
d
U+0064
̣
U+0323
̇
U+0307
q̣̇
U+0071 U+0307 U+0323
q
U+0071
̣
U+0323
̇
U+0307

Шаблон:Якорь Каноническая композиция (NFC)

NFC, англ. Шаблон:Lang-en2 («C» от англ. Шаблон:Lang-en2), форма нормализации C — алгоритм, согласно которому последовательно выполняются каноническая декомпозиция и каноническая композиция. Сначала каноническая декомпозиция (алгоритм NFD) приводит текст к форме D. Затем каноническая композиция — операция, обратная NFD, обрабатывает текст от начала к концу с учётом следующих правил:

  • символ S считается начальным, если имеет нулевой класс комбинируемости (англ. Шаблон:Lang-en2) согласно таблице символов Юникода;
  • в любой последовательности символов, начинающейся с символа S, символ C блокируется от S, только если между S и C есть какой-либо символ B, который либо является начальным, либо имеет одинаковый или больший класс комбинируемости, чем C. Это правило распространяется только на строки, прошедшие каноническую декомпозицию;
  • символ считается первичным композитом, если имеет каноническую декомпозицию в таблице символов Юникода (или каноническую декомпозицию для хангыля и он не входит в список исключений);
  • символ X может быть первично совмещён с символом Y, если и только если существует первичный композит Z, канонически эквивалентный последовательности <X, Y>;
  • если очередной символ C не блокируется последним встреченным начальным базовым символом L и он может быть успешно первично совмещён с ним, то L заменяется на композит L-C, а C удаляется.

Пример:

o
U+006F
̂
U+0302
ô
U+00F4

Шаблон:Якорь Совместимая декомпозиция (NFKD)

NFKD, англ. Шаблон:Lang-en2, форма нормализации KD — совместимая декомпозиция — алгоритм, согласно которому последовательно выполняются каноническая декомпозиция и замены символов текста по таблицам совместимой декомпозиции. Таблицы совместимой декомпозиции предусматривают замену на почти эквивалентные символы<ref>Шаблон:Cite web</ref>:

  • похожих на буквы (ℍ и ℌ);
  • обведённых кружками (①);
  • с изменёнными размерами (カ и カ);
  • повёрнутых (︷ и {);
  • степеней (⁹ и ₉);
  • дробей (Шаблон:1/4);
  • других (™).

Примеры:

U+210D
H
U+0048
U+2460
1
U+0031
U+FF76
U+30AB
U+FE37
{
U+007B
U+2079
9
U+0039
¼
U+00BC
1 4
U+0031 U+2044 U+0034
U+2122
T M
U+0054 U+004D

Шаблон:Якорь Совместимая композиция (NFKC)

NFKC, англ. Шаблон:Lang-en2, форма нормализации KC — алгоритм, согласно которому последовательно выполняются совместимая декомпозиция (алгоритм NFKD) и каноническая композиция (алгоритм NFC).

Свёртка регистра (CF)

Свёртка регистра (case folding) не является алгоритмом нормализации как таковым. Это достаточно быстрое, почти языконезависимое, внутреннее для программы преобразование строк для поиска без учёта регистра.

Существует два алгоритма свёртки регистра:

  • Простой — преобразует символы «один к одному», не меняя длину строки даже в UTF-16: ᾨ → ᾠ. Обычно это преобразование в строчные, но в письме чероки это преобразование в заглавные — заглавные появились первыми.
  • Полный — также разборка монолитных символов на составляющие: ᾨ → ὠ ι

И один флаг:

  • Тюркский режим — это и есть та самая языкозависимость. В турецком и азербайджанском происходит I→ı, İ→i.

Примеры

Исходный текст NFD NFC NFKD NFKC
U+FB01
U+FB01
U+FB01
f i
U+0066 U+0069
f i
U+0066 U+0069
2
U+0032 U+2075
2
U+0032 U+2075
2
U+0032 U+2075
2 5
U+0032 U+0035
2 5
U+0032 U+0035
ẛ̣
U+1E9B U+0323
ſ ̣ ̇
U+017F U+0323 U+0307
̣
U+1E9B U+0323
s ̣ ̇
U+0073 U+0323 U+0307
U+1E69
й
U+0439
и ̆
U+0438 U+0306
й
U+0439
и ̆
U+0438 U+0306
й
U+0439
ё
U+0451
е ̈
U+0435 U+0308
ё
U+0451
е ̈
U+0435 U+0308
ё
U+0451
А
U+0410
А
U+0410
А
U+0410
А
U+0410
А
U+0410
U+304C
U+304B U+3099
U+304C
U+304B U+3099
U+304C
U+2167
U+2167
U+2167
V I I I
U+0056 U+0049 U+0049 U+0049
V I I I
U+0056 U+0049 U+0049 U+0049
ç
U+00E7
c ̧
U+0063 U+0327
ç
U+00E7
c ̧
U+0063 U+0327
ç
U+00E7

Двунаправленное письмо

Стандарт Юникод поддерживает письменности языков как с направлением написания слева направо (англ. Шаблон:Lang-en2), так и с написанием справа налево (англ. Шаблон:Lang-en2) — например, арабское и еврейское письмо. В обоих случаях символы хранятся в «естественном» порядке; их отображение с учётом нужного направления письма обеспечивается приложением.

Кроме того, Юникод поддерживает комбинированные тексты, сочетающие фрагменты с разным направлением письма. Данная возможность называется двунаправленность (англ. Шаблон:Lang-en2). Некоторые упрощённые обработчики текста (например, в сотовых телефонах) могут поддерживать Юникод, но не иметь поддержки двунаправленности. Все символы Юникода поделены на несколько категорий: пишущиеся слева направо, пишущиеся справа налево, и пишущиеся в любом направлении. Символы последней категории (в основном это знаки пунктуации) при отображении принимают направление окружающего их текста.

Представленные символы

Схема основной многоязычной плоскости Юникода

Шаблон:Main

Юникод включает практически все современные письменности, в том числе: Шаблон:Columns-list и другие.

С академическими целями добавлены многие исторические письменности, в том числе: германские руны, древнетюркские руны, древнегреческая письменность, египетские иероглифы, клинопись, письменность майя, этрусский алфавит.

В Юникоде представлен широкий набор математических и музыкальных символов, а также пиктограмм.

Государственные флаги не включены в Юникод напрямую. Для их кодирования используются пары из 26 буквенных символов, предназначенных для представления двухбуквенных кодов стран по стандарту ISO 3166-1 alpha-2. Эти буквы закодированы в диапазоне от Шаблон:Unichar до Шаблон:Unichar.

В Юникод принципиально не включаются логотипы компаний и продуктов, хотя они и встречаются в шрифтах (например, логотип Apple в кодировке MacRoman (0xF0) или логотип Windows в шрифте Wingdings (0xFF)). В юникодовских шрифтах логотипы должны размещаться только в области пользовательских символов. Существуют свободные бесплатные шрифты, включающие в себя логотипы компаний, программных продуктов и другие товарные знаки (например, Шаблон:Нп4<ref>Шаблон:Cite web</ref>).

ISO/IEC 10646

Консорциум Юникода работает в тесной связи с рабочей группой ISO/IEC/JTC1/SC2/WG2, которая занимается разработкой международного стандарта 10646 (ISO/IEC 10646). Между стандартом Юникода и ISO/IEC 10646 установлена синхронизация, хотя каждый стандарт использует свою терминологию и систему документации.

Сотрудничество Консорциума Юникода с Международной организацией по стандартизации (англ. Шаблон:Lang-en2) началось в 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 значит универсальный набор кодированных символов (англ. Шаблон:Lang-en2). UCS-2 можно считать подмножеством UTF-16 (UTF-16 без суррогатных пар), а UCS-4 является синонимом для UTF-32.

Различия стандартов Юникод и ISO/IEC 10646:

  • небольшие различия в терминологии;
  • ISO/IEC 10646 не включает разделы, необходимые для полноценной реализации поддержки Юникода:
    • нет данных о двоичном кодировании символов;
    • нет описания алгоритмов сравнения (англ. Шаблон:Lang-en2) и отрисовки (англ. Шаблон:Lang-en2) символов;
    • нет перечня свойств символов (например, нет перечня свойств, необходимых для реализации поддержки двунаправленного (англ. Шаблон:Lang-en2) письма).

Способы представления

Юникод имеет несколько форм представления (англ. Шаблон:Lang-en2): UTF-8, UTF-16 (UTF-16BE, UTF-16LE) и UTF-32 (UTF-32BE, UTF-32LE). Была разработана также форма представления UTF-7 для передачи по семибитным каналам, но из-за несовместимости с ASCII она не получила распространения и не включена в стандарт. 1 апреля 2005 года были предложены две шуточные формы представления: UTF-9 и UTF-18 (RFCШаблон:Nbsp4042).

В 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

Ошибка скрипта: Модуля «Основная статья» не существует. UTF-8 — представление Юникода, обеспечивающее наибольшую компактность и обратную совместимость с 7-битной системой ASCII; текст, состоящий только из символов с номерами меньше 128, при записи в UTF-8 превращается в обычный текст ASCII и может быть отображён любой программой, работающей с ASCII; и наоборот, текст, закодированный 7-битной ASCII может быть отображён программой, предназначенной для работы с UTF-8. Остальные символы Юникода изображаются последовательностями длиной от 2 до 4 байт, в которых первый байт всегда имеет маску 11xxxxxx, а остальные — 10xxxxxx. В UTF-8 не используются суррогатные пары.

Формат UTF-8 был изобретён 2 сентября 1992 года Кеном Томпсоном и Робом Пайком и реализован в ОС Plan 9<ref>Шаблон:Cite web</ref>. Сейчас стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D.

UTF-16 и UTF-32

Ошибка скрипта: Модуля «Основная статья» не существует. UTF-16 — кодировка, позволяющая записывать символы Юникода в диапазонах U+0000…U+D7FF и U+E000…U+10FFFF (общим количеством 1 112 064). При этом каждый символ записывается одним или двумя словами (суррогатная пара). Кодировка UTF-16 описана в приложении Q к международному стандарту ISO/IEC 10646, а также ей посвящён документ IETF RFC 2781 под названием «UTF-16, an encoding of ISO 10646».

UTF-32 — способ представления Юникода, при котором каждый символ занимает ровно 4 байта. Главное преимущество UTF-32 перед кодировками переменной длины заключается в том, что символы Юникод в ней непосредственно индексируемы, поэтому найти символ по номеру его позиции в файле можно чрезвычайно быстро, и получение любого символа n-й позиции при этом является операцией, занимающей всегда одинаковое время. Это также делает замену символов в строках UTF-32 очень простой. Напротив, кодировки с переменной длиной требуют последовательного доступа к символу n-й позиции, что может быть очень затратной по времени операцией. Главный недостаток UTF-32 — это неэффективное использование пространства, так как для хранения любого символа используется четыре байта. Символы, лежащие за пределами нулевой (базовой) плоскости кодового пространства, редко используются в большинстве текстов. Поэтому удвоение, в сравнении с UTF-16, занимаемого строками в UTF-32 пространства, зачастую не оправдано.

Порядок байтов

Ошибка скрипта: Модуля «Основная статья» не существует. В потоке данных UTF-16 младший байт может записываться либо перед старшим (англ. Шаблон:Lang-en2), либо после старшего (англ. Шаблон:Lang-en2). Аналогично существует два варианта четырёхбайтной кодировки — UTF-32LE и UTF-32BE.

Маркер последовательности байтов

Ошибка скрипта: Модуля «Основная статья» не существует. Для указания на использование Юникода, в начале текстового файла или потока может передаваться Маркер последовательности байтов (англ. Шаблон:Lang-en2) — символ U+FEFF (неразрывный пробел нулевой ширины). По его виду можно легко различить как формат представления Юникода, так и последовательность байтов. Маркер последовательности байтов может принимать следующий вид:

UTF-8
EF BB BF
UTF-16BE
FE FF
UTF-16LE
FF FE
UTF-32BE
00 00 FE FF
UTF-32LE
FF FE 00 00

Юникод и традиционные кодировки

Внедрение Юникода привело к изменению подхода к традиционным 8-битным кодировкам. Если раньше такая кодировка всегда задавалась непосредственно, то теперь она может задаваться таблицей соответствия между данной кодировкой и Юникодом. Фактически почти все 8-битные кодировки теперь можно рассматривать как форму представления некоторого подмножества Юникода. И это намного упростило создание программ, которые должны работать с множеством разных кодировок: теперь, чтобы добавить поддержку ещё одной кодировки, надо всего лишь добавить ещё одну таблицу перекодировки символов в Юникод.

Кроме того, многие форматы данных позволяют вставлять любые символы Юникода, даже если документ записан в старой 8-битной кодировке. Например, в HTML можно использовать коды с амперсандом.

Реализации

Большинство современных операционных систем в той или иной степени обеспечивает поддержку Юникода.

В операционных системах семейства Windows NT для внутреннего представления имён файлов и других системных строк используется двухбайтовая кодировка UTF-16LE. Системные вызовы, принимающие строковые параметры, существуют в однобайтном и двухбайтном вариантах. Подробнее см. в статье Юникод в операционных системах семейства Microsoft Windows.

UNIX-подобные операционные системы, в том числе GNU/Linux, BSD, OS X, используют для представления Юникода кодировку UTF-8. Большинство программ может работать с UTF-8 как с традиционными однобайтными кодировками, не обращая внимания на то, что символ представляется как несколько последовательных байт. Для работы с отдельными символами строки обычно перекодируются в UCS-4, так что каждому символу соответствует машинное слово.

Одной из первых успешных коммерческих реализаций Юникода стала среда программирования Java. В ней принципиально отказались от 8-битного представления символов в пользу 16-битного. Это решение увеличило расход памяти, но позволило вернуть в программирование важную абстракцию: произвольный одиночный символ (тип char). В частности, программист мог работать со строкой, как с простым массивом. Успех не был окончательным, Юникод перерос ограничение в 16 бит и к версии J2SE 5.0 произвольный символ снова стал занимать переменное число единиц памяти — один char или два (см. суррогатная пара).

Крупные, используемые в промышленном программировании языки (Delphi, Си, JavaScript…) содержат тип «юникодная строка UTF-16 или UTF-32». Лишь отдельные из них (PHP) ради производительности на главной задаче (генерации веб-страниц) продолжают использовать 8-битный символ, но способны разбирать UTF-8 на кодовые позиции Юникода.

Методы ввода

Поскольку ни одна раскладка клавиатуры не может позволить вводить все символы Юникода одновременно, от операционных систем и прикладных программ требуется поддержка альтернативных методов ввода произвольных символов Юникода.

Шаблон:Main Начиная с Windows 2000, служебная программа «Таблица символов» (charmap.exe) поддерживает символы Юникода и позволяет копировать их в буфер обмена. Реализована поддержка только базовой плоскости (коды символов U+0000…U+FFFF); символы с кодами от U+10000 «Таблица символов» не отображает. Похожая таблица есть в Microsoft Word.

Иногда можно набрать шестнадцатеричный код, нажать Шаблон:Key, и код будет заменён на соответствующий символ, например, в WordPad, Microsoft Word. В редакторах Шаблон:Key выполняет и обратное преобразование. В программах, работающих в среде Windows, чтобы получить символ Unicode, нужно при нажатой клавише Alt набрать десятичное значение кода символа на цифровой клавиатуре: например, комбинации Alt+0171 и Alt+0187 выводят левую и правую кавычки-ёлочки, соответственно, Alt+0151 — длинное тире, Alt+0769 — знак ударения, Alt+0133 — многоточие и пр.

В Mac OS 8.5 и более поздних версиях поддерживается метод ввода, называемый «Unicode Hex Input». При зажатой клавише Option требуется набрать четырёхзначный шестнадцатеричный код требуемого символа. Этот метод позволяет вводить символы с кодами, большими U+FFFD, используя пары суррогатов; такие пары операционной системой будут автоматически заменены на одиночные символы. Этот метод ввода перед использованием нужно активизировать в соответствующем разделе системных настроек и затем выбрать как текущий метод ввода в меню клавиатуры.

Начиная с Mac OS X 10.2, существует также приложение «Character Palette», позволяющее выбирать символы из таблицы, в которой можно выделять символы определённого блока или символы, поддерживаемые конкретным шрифтом.

В GNOME также есть утилита «Таблица символов» (ранее gucharmap), позволяющая отображать символы определённого блока или системы письма и предоставляющая возможность поиска по названию или описанию символа. Когда код нужного символа известен, его можно ввести в соответствии со стандартом ISOШаблон:Nbsp14755: при зажатых клавишах Шаблон:Key ввести шестнадцатеричный код (начиная с некоторой версии GTK+, ввод кода нужно предварить нажатием клавиши «U»). Вводимый шестнадцатеричный код может иметь до Шаблон:Num в длину, позволяя вводить любые символы Юникода без использования суррогатных пар.

Все приложения [[X Window System|XШаблон:NbspWindow]], включая GNOME и KDE, поддерживают ввод при помощи клавиши Шаблон:Key. Для клавиатур, на которых нет отдельной клавиши Compose, для этой цели можно назначить любую клавишу — например, Шаблон:Key.

Консоль GNU/Linux также допускает ввод символа Юникода по его коду — для этого десятичный код символа нужно ввести цифрами расширенного блока клавиатуры при зажатой клавише Шаблон:Key. Можно вводить символы и по их шестнадцатеричному коду: для этого нужно зажать клавишу Шаблон:Key, и для ввода цифр A—F использовать клавиши расширенного блока клавиатуры от Шаблон:Key до Шаблон:Key (по часовой стрелке). Поддерживается также и ввод в соответствии с ISOШаблон:Nbsp14755. Для того чтобы перечисленные способы могли работать, нужно включить в консоли режим Юникода вызовом unicode_start(1) и выбрать подходящий шрифт вызовом setfont(8).

Mozilla Firefox для Linux поддерживает ввод символов по ISOШаблон:Nbsp14755.

Проблемы Юникода

  • В Юникоде английское «a» и польское «a» — один и тот же символ. Точно так же одним и тем же символом (но отличающимся от «a» латинского) считаются русское «а» и сербское «а». Такой принцип кодирования не универсален; по-видимому, решения «на все случаи жизни» вообще не может существовать.
  • Тексты на китайском, корейском и японском языках имеют традиционное написание сверху вниз, начиная с правого верхнего угла. Переключение горизонтального и вертикального написания для этих языков не предусмотрено в Юникоде — это должно осуществляться средствами языков разметки или внутренними механизмами текстовых процессоров.
  • Наличие или отсутствие в Юникоде разных начертаний одного и того же символа в зависимости от языка. Нужно следить, чтобы текст всегда был правильно помечен как относящийся к тому или другому языку.
    Так, китайские иероглифы могут иметь разные начертания в китайском, японском (кандзи) и корейском (ханча), но при этом в Юникоде обозначаются одним и тем же символом (так называемая ККЯ-унификация), хотя упрощённые и полные иероглифы всё же имеют разные коды.
    Аналогично, русский и сербский языки используют разное начертание курсивных букв п и т (в сербском они выглядят как Шаблон:Lang-sr2 (и̅) и Шаблон:Lang-sr2 (ш̅), см. сербский курсив).
  • Перевод из строчных букв в заглавные тоже зависит от языка. Например: в турецком существуют буквы İi и Iı — таким образом, турецкие правила изменения регистра конфликтуют с английскими, которые предписывают «i» переводить в «I». Подобные проблемы есть и в других языках — например, в канадском диалекте французского языка регистр переводится немного не так, как во Франции<ref>Шаблон:Cite web</ref>.
  • Даже с арабскими цифрами есть определённые типографские тонкости: цифры бывают «прописными» и «строчными», пропорциональными и моноширинными<ref>В большинстве шрифтов для ПК реализованы «прописные» (маюскульные) моноширинные цифры.</ref> — для Юникода разницы между ними нет. Подобные нюансы остаются за программным обеспечением.
  • Поддержка расширенных египетских иероглифов в Юникоде 16.0 оказалась крайне некачественной, сплошь и рядом изображение не соответствует описанию. Наиболее известное — в описании long-curved beard (божественная борода), на изображении нечто напоминающее прямую царскую. В версии 17.0 произошло несколько обменов глифами из-за некорректной разунификации — когда разунифицировали гамадрила со стоячим и лежачим хвостом, в 16.0 символ 130FB имел лежачий хвост, а 13AE8 — стоячий, в 17.0 наоборот, что более соответствует каталогу Гардинера.

Некоторые недостатки связаны не с самим Юникодом, а с возможностями обработчиков текста.

  • Файлы нелатинского текста в Юникоде всегда занимают больше места, так как один символ кодируется не одним байтом, как в различных национальных кодировках, а последовательностью байтов (исключение составляет UTF-8 для языков, алфавит которых укладывается в ASCII, а также наличие в тексте символов двух и более языков, алфавит которых не укладывается в ASCII<ref>В некоторых случаях документ (не простой текст) в Юникоде может занимать существенно меньше места, чем документ в однобайтовой кодировке. Например, если некая веб-страница содержит примерно поровну русского и греческого текста, то в однобайтовой кодировке придётся либо русские, либо греческие буквы записывать, используя возможности формата документов, в виде кодов с амперсандом, которые занимают 6—7 байт на символ (при использовании десятичных кодов), то есть в среднем на букву придётся 3,5—4 байта, в то время как UTF-8 занимает только 2 байта на греческую или русскую букву.</ref>). Файл шрифта всех символов таблицы Юникод занимает сравнительно много места в памяти и требует бо́льших вычислительных ресурсов, чем шрифт только одного национального языка пользователя<ref>Один из файлов шрифтов Arial Unicode имеет размер 24 мегабайта; существует Times New Roman размером 120 мегабайт, он содержит количество символов, близкое к 65536.</ref>. С увеличением мощности компьютерных систем и удешевлением памяти и дискового пространства эта проблема становится всё менее существенной; тем не менее, она остаётся актуальной для портативных устройств, например, для мобильных телефонов.
  • Хотя поддержка Юникода реализована в наиболее распространённых операционных системах, до сих пор не всё прикладное программное обеспечение поддерживает корректную работу с ним. В частности, не всегда обрабатываются метки порядка байтов (BOM) и плохо поддерживаются диакритические символы. Проблема является временной и есть следствие сравнительной новизны стандартов Юникода (в сравнении с однобайтовыми национальными кодировками).
  • Производительность всех программ обработки строк (в том числе и сортировок в БД) снижается при использовании Юникода вместо однобайтовых кодировок.
  • Некоторые редкие системы письма всё ещё не представлены должным образом в Юникоде. Изображение «длинных» надстрочных символов, простирающихся над несколькими буквами, как, например, в церковнославянском языке, пока не реализовано.

Написание слова «Unicode»

«Unicode» — одновременно и имя собственное (или часть имени, например, Unicode Consortium), и имя нарицательное, происходящее из английского языка.

На первый взгляд предпочтительнее использовать написание «Уникод». В русском языке уже есть морфемы «уни-» (слова с латинским элементом «uni-» традиционно переводились и писались через «уни-»: универсальный, униполярный, унификация, униформа) и «код». Напротив, торговые марки, заимствованные из английского языка, обычно передаются посредством практической транскрипции, в которой деэтимологизированное сочетание букв «uni-» записывается в виде «юни-» («Юнилевер», «Юникс» и т. п.), то есть точно так же, как в случае с побуквенными сокращениями, вроде UNICEF «United Nations International Children’s Emergency Fund» — ЮНИСЕФ.

На сайте Консорциума есть специальная страница, где рассматриваются проблемы передачи слова «Unicode» в различных языках и системах письма. Для русской кириллицы указан вариант «Юникод»<ref name=autogenerated1 />. В MS Windows также используется вариант «Юникод».

В Википедии на русском языке используется вариант «Юникод» как наиболее распространённый.

См. также

Примечания

Шаблон:Примечания

Ссылки

Шаблон:Стандарты ISO Шаблон:Шрифтовой дизайн