Стандарт предложен в1991 годунекоммерческой организацией «Консорциум Юникода» (англ.Unicode Consortium, Unicode Inc.)[3][4].Применение этого стандарта позволяет закодировать очень большое число символов из разных систем письменности: в документах, закодированных по стандарту Юникод, могут соседствовать китайскиеиероглифы,математические символы, буквыгреческого алфавита,латиницыикириллицы,символы музыкальной нотной нотации, при этом становится ненужным переключениекодовых страниц[5].
Стандарт состоит из двух основных частей: универсального набора символов (англ.Universal character set, UCS) и семейства кодировок (англ.Unicode transformation format, UTF). Универсальный набор символов перечисляет допустимые по стандарту Юникод символы и присваивает каждому символу код в виде неотрицательного целого числа, записываемого обычно в шестнадцатеричной форме с префиксомU+,например,U+040F.Семейство кодировок определяет способы преобразования кодов символов для передачи в потоке или в файле.
Коды в стандарте Юникод разделены на несколько областей. Область с кодами от U+0000 до U+007F содержит символы набораASCII,и коды этих символов совпадают с их кодами в ASCII. Далее расположены области символов других систем письменности, знаки пунктуации и технические символы. Часть кодов зарезервирована для использования в будущем[6].Под символы кириллицы выделены области знаков с кодами от U+0400 до U+052F, от U+2DE0 до U+2DFF, от U+A640 до U+A69F (см.Кириллица в Юникоде)[7].
Unicode — это уникальный код для любого символа, независимо от платформы, независимо от программы, независимо от языка.Консорциум Юникода[8]
К концу 1980-х годов стандартом стали 8-битные кодировки, их существовало уже большое множество, и постоянно появлялись новые. Это объяснялось как расширением круга поддерживаемых языков, так и стремлением создавать кодировки, частично совместимые между собой (характерный пример — появлениеальтернативной кодировки для русского языка,обусловленное эксплуатацией западных программ, созданных для кодировкиCP437). В результате появилось несколько проблем:
проблема неправильной раскодировки;
проблема ограниченности набора символов;
проблема преобразования одной кодировки в другую;
проблема дублирования шрифтов.
Проблема неправильной раскодировкивызывала появление в документе символов иностранных языков, не предполагавшихся в документе, или появление не предполагавшихсяпсевдографическихсимволов, прозванных русскоязычными пользователями «кракозябрами». Проблема во многом была вызвана отсутствием стандартизированной формы указания кодировки для файла или потока. Проблему можно было решить либо последовательным внедрением стандарта указания кодировки, либо внедрением общей для всех языков кодировки.[5]
Проблема ограниченности набора символов[5].Проблему можно было решить либо переключением шрифтов внутри документа, либо внедрением «широкой» кодировки. Переключение шрифтов издавна практиковалось втекстовых процессорах,причём часто использовалисьшрифты с нестандартной кодировкой,т. н. «dingbat fonts». В итоге при попытке переноса документа в другую систему все нестандартные символы превращались в «кракозябры».
Проблема преобразования одной кодировки в другую.Проблему можно было решить либо составлением таблиц перекодировки для каждой пары кодировок, либо использованием промежуточного преобразования в третью кодировку, включающую все символы всех кодировок[9].
Проблема дублирования шрифтов.Для каждой кодировки создавался свой шрифт, даже если наборы символов в кодировках совпадали частично или полностью. Проблему можно было решить путём создания «больших» шрифтов, из которых впоследствии выбирались бы нужные для данной кодировки символы. Однако это требовало создания единого реестра символов, чтобы определять, чему что соответствует.
Была признана необходимость создания единой «широкой» кодировки. Кодировки с переменной длиной символа, широко использующиеся в Восточной Азии, были признаны слишком сложными в использовании, поэтому было решено использовать символы фиксированной ширины. Использование 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 году, последней версией на данный момент является 15.1.0(12 сентября2023)[12].Версии стандарта 1.0—5.0 публиковались как книги и имеютISBN[13][14].
База данных символов Юникода (Unicode Character Database) доступна для всех версий на официальном сайте как в простом текстовом, так и в XML-формате. Файлы распространяются под BSD-подобнойлицензией.
Удалены добавленные ранее слогихангыля,и добавлены 11 172 новых слога хангыля с новыми кодами. Возвращены удалённые ранее символытибетского письма;символы получили новые коды и были размещены в разных таблицах. Введён механизм суррогатных (англ.surrogate) символов. Выделено место для плоскостей (англ.planes)15 и 16[22]
Добавлены 897 иероглифовкитайских имён,которые китайцы хотели расположить на плоскости 0A; 622 из них опознаны как новые. Также 5 символов структуры китайских иероглифов, 10 разныхZWJ-последовательностейэмодзии 18 последовательностей, изображающих людей, которые смотрят вправо (исключая цвета кожи).
↑Включаяпечатаемые (англ.graphic), управляющие (англ.control) и форматирующие (англ.format) символы;не включаяличные символы(англ.private-use), несимвольные позиции (англ.noncharacters), половинысуррогатных пар(англ.surrogate code points), неофициально занятые (U+1D548ажурноеℚ при официальном U+211A — используется, чтобы гарантированно набрать слово одним шрифтом; U+11C09бхайкшукиначальное слоговое LL — всанскритебуква есть, но не найдена в источниках именно письмом бхайкшуки). Пресс-релизы Юникода дают цифру на 65 меньше — не учитывают управляющие (00…1F, 7F…9F). Стоит признать, что категория этих символов поначалу несколько раз менялась. При дальнейшем обновлении данных: количество заявленных символов + 65.
Хотя форма записи UTF-8 позволяет кодировать до 221(2 097 152) кодовых позиций, было принято решение использовать лишь 1 112 064 для совместимости с UTF-16. Впрочем, даже и этого в данный момент более чем достаточно — в версии 15.1 используется всего 149 878 кодовых позиций.
Кодовое пространство разбито на 17плоскостей(англ.planes) по 216(65 536) символов. Нулевая плоскость (plane 0) называетсябазовой(basic) и содержит символы наиболее употребительных письменностей. Остальные плоскости — дополнительные (supplementary). Первая плоскость (plane 1) используется в основном для исторических письменностей, вторая (plane 2) — для редко используемых иероглифовкитайского письма (ККЯ),третья (plane 3) зарезервирована для архаичных китайских иероглифов[66].Плоскость 14 отведена для символов, используемых по особому назначению. Плоскости 15 и 16 выделены для частного употребления[6].
Для обозначения символов Unicode используется запись вида «U+xxxx» (для кодов 0…FFFF), или «U+xxxxx» (для кодов 10000…FFFFF), или «U+xxxxxx» (для кодов 100000…10FFFF), гдеxxx—шестнадцатеричныецифры. Например, символ «я» (U+044F) имеет код 044F16= 110310.
Универсальная система кодирования (Юникод) представляет собой набор графических символов и способ их кодирования длякомпьютернойобработки текстовых данных.
Графические или печатаемые символы — это символы, имеющие видимое изображение. Графическим символам противопоставляются управляющие и форматирующие символы.
Графические символы включают в себя следующие группы:
буквы, содержащиеся хотя бы в одном из обслуживаемыхалфавитов;
Юникод — это система для линейного представления текста. Символы, имеющие дополнительные над- или подстрочные элементы, могут быть представлены в виде построенной по определённым правилам последовательности кодов (составной вариант, composite character) или в виде единого символа (монолитный вариант, precomposed character). С 2014 года считается, что все буквы крупных письменностей в Юникод внесены, и если символ доступен в составном варианте, дублировать его в монолитном виде не нужно.
Как только символ появился в кодировке, он не сдвинется и не исчезнет. Таким образом, каждый новый Юникод будет надмножеством старого. Если символ окажется плохим, его запрещают. Если же потребуется изменить порядок символов, это делается не переменой позиций, а национальным порядком сортировки. Есть и другие, более тонкие гарантии стабильности — например, не будут меняться таблицы нормализации[67].
Динамическая компоновка
Такой высокой цели, как универсальность, Юникод добивается путём динамической сборки печатного текста. Иногда для удобства делают и монолитные символы, но в целомA + ¨ = Ä.
Логический порядок
Символы в строке записываются приблизительно в порядке прочтения, в том числе в двунаправленном письме: арабский текст кодируется справа налево, а оказавшееся в нём европейское число — слева направо. Метка (умляут, огласовка…) идёт после основного символа. Есть исключения с визуальным порядком (например,лаосский).
Преобразуемость
Если в важной кодировке две формы одного символа закодированы разными позициями, это делает и Юникод. Преобразование не обязательно 1:1 — один символ другой кодировки может преобразоваться в несколько символов Юникода, и наоборот.
Юникод кодирует простой текст без оформления. Считается, что простой текст должен хранить достаточно данных, чтобы читаемо отобразить его, и больше ничего.
Семантика
Свойства символов задаются формально, с помощью форматовCSVиXML.
Символы, не глифы
Символ — единица смысла. Глиф — изображение, содержащееся в шрифте и выводящееся на экран/печать.
Так, в шрифте арабского стилянастали́кбудут тысячи глифов. Но в кодировке около 200 символов стандартного арабского, передающих смысл. И наоборот, иногда (см.Унификация) разные символы могут иметь одинаковый глиф.
Нарушение этого принципа или историческое (σ≠ς, существовало ещё до принципа динамической компоновки), или вызвано сложностями шрифтов (Ţ≠Ț, последнее используется вмолдавскомирумынском).
Универсальность
Юникод разработан для людей разных языков и профессий: работающих в бизнесе, образовании, религии и науке, для современных и исторических текстов.
За пределами Юникода лежат:
письменности, про которые мало что известно, чтобы надёжно закодировать символы;
письменности, чьи пользователи не пришли к де-факто стандарту;
нетекстовые (например, пиктографические) письменности.
Унификация
Юникод старается не дублировать символы. Так, английская буква «вай», французская «игрек» и немецкая «ипсилон» — одна и та же кодовая позицияY.Мало того, сходные иероглифы китайского и японского — одна кодовая позиция.
Существует несколько важных исключений. Сходные буквыразныхписьменностей кодируются разными кодовыми позициями. Часто позиции дублируются для упрощения обработки — так, в Юникоде три буквы Ð с разными строчными.Математический штрихи такой же штрих для индикациимягкости звуков— разные символы, второй считается буквой-модификатором. Преобразуемость может идти вразрез с унификацией — строчная греческаясигмаимеет две разных формы, и они — разные кодовые позиции.
Эффективность
Юникод устроен так, чтобы эффективные реализации были осуществимы. Коды символов — последовательные числа от 0 до 10FFFF16,это позволяет иметь дело стаблицами поиска.UTF-8 и UTF-16 — самосинхронизирующиеся коды, а важнейшие символы доступны без раскодировки. Юникод избегает форматирующих символов, которые меняют внутреннее состояние. И многое другое.
Консорциум не создаёт нового, а констатирует сложившийся порядок вещей[68].Например, картинки «эмодзи» были добавлены потому, что японские операторы мобильной связи широко их использовали. Для этого добавление символа проходит через сложный процесс[68].И, например,символ российского рубляпрошёл его за три месяца, как только получил официальный статус, причём до этого он много лет де-факто использовался и его отказывались включить в Юникод.
Символы в Юникоде подразделяются на базовые (англ.base characters) и комбинирующие (англ.combining marks). Метки обычно следуют за базовым символом и изменяют его отображение определённым образом. К комбинирующим символам, например, относятсядиакритические знаки,знаки ударения. Например, русскую букву «Й» в Юникоде можно записать в виде базового символа «И» (U+0418) и комбинирующего символа « ̆» (U+0306), отображаемого над базовым.
Комбинирующие символы помечены в таблицах символов Юникода особыми категориями:
Nonspacing Mark — непротяжённая метка; таковые обычно отображаются над или под базовым символом и крайне редко раздвигаюткегельную площадкусимвола (например,ï);
Enclosing Mark — охватывающая метка; эти метки охватывают символ со всех сторон и в идеале должны расширять его кегельную площадку;
Spacing Mark — протяжённая метка; представляет собой глиф перед или после основного символа, обладающий собственной кегельной площадкой.
Особый тип комбинирующих символов — селекторы варианта начертания (англ.variation selectors). Они действуют только на те базовые символы, для которых такие варианты определены. К примеру, в версии Юникода 5.0 варианты начертания определены для ряда математических символов, для символовтрадиционного монгольского алфавитаи для символовмонгольского квадратного письма.
Из-за наличия в Юникоде комбинирующих символов одни и те же знаки письменности можно представить различными кодами. Так, например, букву «Й» в примере выше можно записать как отдельным символом, так и сочетанием базового и комбинированного. Из-за этого сравнение строк байт за байтом становится невозможным. Алгоритмы нормализации (англ.normalization forms) решают эту проблему, выполняя приведение символов к определённому стандартному виду. Приведение осуществляется путём замены символов на эквивалентные с использованием таблиц и правил. «Декомпозицией» называется замена (разложение) одного символа на несколько составляющих символов, а «композицией», наоборот, — замена (соединение) нескольких составляющих символов на один символ.
В стандарте Юникода определены четыре алгоритма нормализации текста: NFD, NFC, NFKD и NFKC.
NFD,англ.normalizationformD(«D» отангл.decomposition), форма нормализации D — каноническая декомпозиция — алгоритм, согласно которому выполняется рекурсивное разложение составных символов (англ.precomposed characters) на последовательность из одного или нескольких простых символов в соответствии с таблицами декомпозиции. Рекурсивное потому, что в процессе разложения составной символ может быть разложен на несколько других, некоторые из которых тоже являются составными, и к которым применяется дальнейшее разложение.
NFC,англ.normalizationformC(«C» отангл.composition), форма нормализации C — алгоритм, согласно которому последовательно выполняются каноническая декомпозиция и каноническая композиция. Сначала каноническая декомпозиция (алгоритм NFD) приводит текст к форме D. Затем каноническая композиция — операция, обратная NFD, обрабатывает текст от начала к концу с учётом следующих правил:
символSсчитаетсяначальным,если имеет нулевой класс комбинируемости (англ.combining class of zero) согласно таблице символов Юникода;
в любой последовательности символов, начинающейся с символаS,символCблокируется отS,только если междуSиCесть какой-либо символB,который либо является начальным, либо имеет одинаковый или больший класс комбинируемости, чемC.Это правило распространяется только на строки, прошедшие каноническую декомпозицию;
символ считаетсяпервичнымкомпозитом, если имеет каноническую декомпозицию в таблице символов Юникода (или каноническую декомпозицию дляхангыляи он не входит всписок исключений);
символXможет быть первично совмещён с символомY,если и только если существует первичный композитZ,канонически эквивалентный последовательности <X,Y>;
если очередной символCне блокируется последним встреченным начальным базовым символомLи он может быть успешно первично совмещён с ним, тоLзаменяется на композитL-C,аCудаляется.
NFKD,англ.normalizationformKD,форма нормализации KD — совместимая декомпозиция — алгоритм, согласно которому последовательно выполняются каноническая декомпозиция и замены символов текста по таблицам совместимой декомпозиции. Таблицы совместимой декомпозиции предусматривают замену на почти эквивалентные символы[70]:
Стандарт Юникод поддерживает письменности языков как с направлением написания слева направо (англ.left-to-right, LTR), так и с написанием справа налево (англ.right-to-left, RTL) — например,арабскоеиеврейскоеписьмо. В обоих случаях символы хранятся в «естественном» порядке; их отображение с учётом нужного направления письма обеспечивается приложением.
Кроме того, Юникод поддерживает комбинированные тексты, сочетающие фрагменты с разным направлением письма. Данная возможность называетсядвунаправленность(англ.bidirectional text, BiDi). Некоторые упрощённые обработчики текста (например, в сотовых телефонах) могут поддерживать Юникод, но не иметь поддержки двунаправленности. Все символы Юникода поделены на несколько категорий: пишущиеся слева направо, пишущиеся справа налево, и пишущиеся в любом направлении. Символы последней категории (в основном этознаки пунктуации) при отображении принимают направление окружающего их текста.
Государственные флагине включены в Юникод напрямую. Для их кодирования используются пары из 26 буквенных символов, предназначенных для представления двухбуквенных кодов стран по стандартуISO 3166-1 alpha-2.Эти буквы закодированы в диапазоне отU+1F1E6🇦regional indicator symbol letter a(HTML🇦) доU+1F1FF🇿regional indicator symbol letter z(HTML🇿).
В Юникод принципиально не включаютсялоготипыкомпаний и продуктов, хотя они и встречаются в шрифтах (например, логотипAppleв кодировкеMacRoman(0xF0) или логотипWindowsв шрифте Wingdings (0xFF)). В юникодовских шрифтах логотипы должны размещаться только в области пользовательских символов. Существуют свободные бесплатные шрифты, включающие в себя логотипы компаний, программных продуктов и другие товарные знаки (например,Шрифт Awesome[англ.][71]).
Консорциум Юникода работает в тесной связи с рабочей группой ISO/IEC/JTC1/SC2/WG2, которая занимается разработкой международного стандарта 10646 (ISO/IEC10646). Между стандартом Юникода и 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 coded character set). UCS-2 можно считать подмножеством UTF-16 (UTF-16 без суррогатных пар), а UCS-4 является синонимом для UTF-32.
Различия стандартов Юникод и ISO/IEC 10646:
небольшие различия в терминологии;
ISO/IEC 10646 не включает разделы, необходимые для полноценной реализации поддержки Юникода:
нет данных о двоичном кодировании символов;
нет описания алгоритмов сравнения (англ.collation) и отрисовки (англ.rendering) символов;
нет перечня свойств символов (например, нет перечня свойств, необходимых для реализации поддержки двунаправленного (англ.bi-directional) письма).
Юникод имеет несколько форм представления (англ.Unicode transformation format, UTF):UTF-8,UTF-16(UTF-16BE, UTF-16LE) иUTF-32(UTF-32BE, UTF-32LE). Была разработана также форма представленияUTF-7для передачи по семибитным каналам, но из-за несовместимости сASCIIона не получила распространения и не включена в стандарт. 1 апреля 2005 года были предложены двешуточныеформы представления: UTF-9 и UTF-18 (RFC 4042).
Punycode— другая форма кодирования последовательностей Unicode-символов в так называемые ACE-последовательности, которые состоят только из алфавитно-цифровых символов, как это разрешено в доменных именах.
UTF-8 — представление Юникода, обеспечивающее наибольшую компактность и обратную совместимость с 7-битной системойASCII;текст, состоящий только из символов с номерами меньше 128, при записи в UTF-8 превращается в обычный текстASCIIи может быть отображён любой программой, работающей с ASCII; и наоборот, текст, закодированный 7-битной ASCII может быть отображён программой, предназначенной для работы с UTF-8. Остальные символы Юникода изображаются последовательностями длиной от 2 до 4 байт, в которых первый байт всегда имеет маску11xxxxxx,а остальные —10xxxxxx.В UTF-8 не используются суррогатные пары.
UTF-16 — кодировка, позволяющая записывать символы Юникода в диапазонах U+0000…U+D7FF и U+E000…U+10FFFF (общим количеством 1 112 064). При этом каждый символ записывается одним или двумя словами (суррогатная пара). Кодировка UTF-16 описана в приложении Q к международному стандарту ISO/IEC 10646, а также ей посвящён документ IETFRFC 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 младший байт может записываться либо перед старшим (англ.UTF-16 little-endian, UTF-16LE), либо после старшего (англ.UTF-16 big-endian, UTF-16BE). Аналогично существует два варианта четырёхбайтной кодировки — UTF-32LE и UTF-32BE.
Для указания на использование Юникода, в начале текстового файла или потока может передаватьсяМаркер последовательности байтов(англ.byte order mark (BOM)) — символ U+FEFF (неразрывный пробел нулевой ширины). По его виду можно легко различить как формат представления Юникода, так и последовательность байтов. Маркер последовательности байтов может принимать следующий вид:
Внедрение Юникода привело к изменению подхода к традиционным 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или два (см.суррогатная пара).
Сейчас[когда?]большинство[сколько?]языков программирования поддерживает строки Юникода, хотя их представление может различаться в зависимости от реализации.
Начиная сWindows 2000,служебная программа «Таблица символов» (charmap.exe) поддерживает символы Юникода и позволяет копировать их вбуфер обмена.Реализована поддержка только базовой плоскости (коды символов U+0000…U+FFFF); символы с кодами от U+10000 «Таблица символов» не отображает. Похожая таблица есть вMicrosoft Word.
Иногда можно набратьшестнадцатеричныйкод, нажатьAlt+X,и код будет заменён на соответствующий символ, например, вWordPad,Microsoft Word. В редакторахAlt+Xвыполняет и обратное преобразование. В программах, работающих в среде Windows, чтобы получить символ Unicode, нужнопри нажатой клавише Altнабрать десятичное значение кода символа на цифровой клавиатуре: например, комбинации Alt+0171 и Alt+0187 выводят левую и правуюкавычки-ёлочки,соответственно, Alt+0151 — длинное тире, Alt+0769 —знак ударения,Alt+0133 — многоточие и пр.
ВMac OS8.5 и более поздних версиях поддерживается метод ввода, называемый «Unicode Hex Input». При зажатой клавише Option требуется набрать четырёхзначный шестнадцатеричный код требуемого символа. Этот метод позволяет вводить символы с кодами, большими U+FFFD, используя пары суррогатов; такие пары операционной системой будут автоматически заменены на одиночные символы. Этот метод ввода перед использованием нужно активизировать в соответствующем разделе системных настроек и затем выбрать как текущий метод ввода в меню клавиатуры.
Начиная сMac OS X10.2, существует также приложение «Character Palette», позволяющее выбирать символы из таблицы, в которой можно выделять символы определённого блока или символы, поддерживаемые конкретным шрифтом.
ВGNOMEтакже есть утилита «Таблица символов» (ранее gucharmap), позволяющая отображать символы определённого блока или системы письма и предоставляющая возможность поиска по названию или описанию символа. Когда код нужного символа известен, его можно ввести в соответствии со стандартомISO14755: при зажатых клавишах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» латинского) считаются русское «а» и сербское «а». Такой принцип кодирования не универсален; по-видимому, решения «на все случаи жизни» вообще не может существовать.
Тексты накитайском,корейскомияпонскомязыках имеют традиционное написание сверху вниз, начиная с правого верхнего угла. Переключение горизонтального и вертикального написания для этих языков не предусмотрено в Юникоде — это должно осуществляться средствамиязыков разметкиили внутренними механизмамитекстовых процессоров.
Наличие или отсутствие в Юникоде разных начертаний одного и того же символа в зависимости от языка. Нужно следить, чтобы текст всегда был правильно помечен как относящийся к тому или другому языку.
Так,китайские иероглифымогут иметь разные начертания в китайском, японском (кандзи) и корейском (ханча), но при этом в Юникоде обозначаются одним и тем же символом (так называемая ККЯ-унификация), хотя упрощённые и полные иероглифы всё же имеют разные коды.
Перевод из строчных букв в заглавные тоже зависит от языка. Например: втурецкомсуществуют буквыİi и Iı— таким образом, турецкие правила изменения регистра конфликтуют санглийскими,которые предписывают «i» переводить в «I». Подобные проблемы есть и в других языках — например, в канадском диалекте французского языка регистр переводится немного не так, как во Франции[73].
Даже сарабскими цифрамиесть определённые типографские тонкости: цифры бывают «прописными» и «строчными», пропорциональными имоноширинными[74]— для Юникода разницы между ними нет. Подобные нюансы остаются за программным обеспечением.
Некоторые недостатки связаны не с самим Юникодом, а с возможностями обработчиков текста.
Файлы нелатинского текста в Юникоде всегда занимают больше места, так как один символ кодируется не одним байтом, как в различных национальных кодировках, а последовательностью байтов (исключение составляет UTF-8 для языков, алфавит которых укладывается в ASCII, а также наличие в тексте символов двух и более языков, алфавит которыхнеукладывается в ASCII[75]). Файл шрифта всех символов таблицы Юникод занимает сравнительно много места в памяти и требует бо́льших вычислительных ресурсов, чем шрифт только одного национального языка пользователя[76].С увеличением мощности компьютерных систем и удешевлением памяти и дискового пространства эта проблема становится всё менее существенной; тем не менее, она остаётся актуальной для портативных устройств, например, для мобильных телефонов.
Хотя поддержка Юникода реализована в наиболее распространённых операционных системах, до сих пор не всё прикладное программное обеспечение поддерживает корректную работу с ним. В частности, не всегда обрабатываются метки порядка байтов (BOM) и плохо поддерживаютсядиакритические символы.Проблема является временной и есть следствие сравнительной новизны стандартов Юникода (в сравнении с однобайтовыми национальными кодировками).
Производительность всех программ обработки строк (в том числе и сортировок в БД) снижается при использовании Юникода вместо однобайтовых кодировок.
Некоторые редкие системы письма всё ещё не представлены должным образом в Юникоде. Изображение «длинных» надстрочных символов, простирающихся над несколькими буквами, как, например, вцерковнославянском языке,пока не реализовано.
«Unicode» — одновременно и имя собственное (или часть имени, например, Unicode Consortium), и имя нарицательное, происходящее из английского языка.
На первый взгляд предпочтительнее использовать написание «Уникод». Врусском языкеуже естьморфемы«уни-» (слова с латинским элементом «uni-» традиционно переводились и писались через «уни-»: универсальный, униполярный, унификация, униформа) и «код». Напротив, торговые марки, заимствованные изанглийского языка,обычно передаются посредством практической транскрипции, в которой деэтимологизированное сочетание букв «uni-» записывается в виде «юни-» («Юнилевер», «Юникс» и т. п.), то есть точно так же, как в случае с побуквенными сокращениями, вродеUNICEF«United Nations International Children’s Emergency Fund» —ЮНИСЕФ.
На сайте Консорциума есть специальная страница, где рассматриваются проблемы передачи слова «Unicode» в различных языках и системах письма. Для русской кириллицы указан вариант «Юникод»[1].ВMS Windowsтакже используется вариант «Юникод».
↑В большинстве шрифтов для ПК реализованы «прописные» (маюскульные) моноширинные цифры.
↑В некоторых случаях документ (не простой текст) в Юникоде может занимать существенно меньше места, чем документ в однобайтовой кодировке. Например, если некая веб-страница содержит примерно поровну русского и греческого текста, то в однобайтовой кодировке придётся либо русские, либо греческие буквы записывать, используя возможности формата документов, в виде кодов с амперсандом, которые занимают 6—7 байт на символ (при использовании десятичных кодов), то есть в среднем на букву придётся 3,5—4 байта, в то время как UTF-8 занимает только 2 байта на греческую или русскую букву.
↑Один из файлов шрифтов Arial Unicode имеет размер 24 мегабайта; существует Times New Roman размером 120 мегабайт, он содержит количество символов, близкое к 65536.