Для кодирования символов в unicode используется. Кодирование звуковой информации. Недостатки национальных кодировок

Юникод

Логотип Unicode Consortium

Юникод (чаще всего) или Уникод (англ. Unicode ) - стандарт кодирования символов, позволяющий представить знаки почти всех письменных языков.

Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. Unicode Consortium, Unicode Inc. ).

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

Решающим для набора символов является информация заголовка типа документа. Однако некоторые веб-браузеры предлагают команду для отображения информации о странице или свойств, которые также приводят к информации заголовка. Откуда взялась информация заголовка о типе документа и наборе символов? Доступны следующие параметры.

Как упоминалось выше, задача веб-браузера заключается в распознавании набора символов документа и правильном отображении документа. Однако большинство браузеров учитывают только информацию заголовка и игнорируют тег. В дополнение к правильному распознаванию набора символов два фактора определяют правильное представление страницы.

Стандарт состоит из двух основных разделов: универсальный набор символов (англ. UCS, universal character set ) и семейство кодировок (англ. UTF, Unicode transformation format ).

Универсальный набор символов задаёт однозначное соответствие символов кодам - элементам кодового пространства, представляющим неотрицательные целые числа. Семейство кодировок определяет машинное представление последовательности кодов UCS.

  • Браузер должен знать набор символов.
  • Это отнюдь не всегда так.
  • Это не проблема для знаков, используемых в Европе.
  • Таким образом, содержимое тега применяется.
Такие функции, как эхо или печать, просто отображают строку символов без изменений и не заботятся о наборе символов.

Вы также можете использовать регулярные выражения для многобайтовых строк, отправлять электронные письма и т.д. Это больше не изменяет информацию. Это позволяет настроить набор символов для конкретного документа. Вы можете не только установить желаемый набор символов для сервера или базы данных, но также для каждой таблицы и даже для каждого отдельного столбца в таблице.

Коды в стандарте Юникод разделены на несколько областей. Область с кодами от U+0000 до U+007F содержит символы набора ASCII с соответствующими кодами. Далее расположены области знаков различных письменностей, знаки пунктуации и технические символы.

Часть кодов зарезервирована для использования в будущем. Под символы кириллицы выделены области знаков с кодами от U+0400 до U+052F, от U+2DE0 до U+2DFF, от U+A640 до U+A69F (см. Кириллица в Юникоде).

Конфигурация набора символов по умолчанию

Однако в списке отсутствует латинский символ. Этот параметр применяется к новым базам данных, таблицам и текстовым столбцам, если только разные символы не указаны явно при создании этих объектов.

Преобразование набора символов в клиентские библиотеки

Вы можете изменить некоторые из этих переменных в своей клиентской программе.

Иногда, но не всегда. Эта программа поразительно хорошо подходит для всех видов персонажей. Как и ожидалось, эта программа также демонстрирует небольшие проблемы с набором символов. Большинство программ, и особенно всех текстовых команд, придерживаются этой настройки.

  • 1 Предпосылки создания и развитие Юникода
  • 2 Версии Юникода
  • 3 Кодовое пространство
  • 4 Система кодирования
    • 4.1 Политика консорциума
    • 4.2 Объединение и дублирование символов
  • 5 Модифицирующие символы
  • 6 Алгоритмы нормализации
    • 6.1 NFD
    • 6.2 NFC
    • 6.3 NFKD
    • 6.4 NFKC
    • 6.5 Примеры
  • 7 Двунаправленное письмо
  • 8 Представленные символы
  • 9 ISO/IEC 10646
  • 10 Способы представления
    • 10.1 UTF-8
    • 10.2 Порядок байтов
    • 10.3 Юникод и традиционные кодировки
    • 10.4 Реализации
  • 11 Методы ввода
  • 12 Проблемы Юникода
  • 13 «Юникод» или «Уникод»?

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

К концу 1980-х годов стандартом стали 8-битные символы. При этом существовало множество разных 8-битных кодировок, и постоянно появлялись всё новые.

Развивайте навыки в этой теме

Если эти переменные установлены, это зависит от распределения. Некоторые дистрибутивы также предоставляют удобные инструменты настройки для изменения набора символов. Этот контент является частью прогрессивного пути знаний для продвижения ваших навыков.

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

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

В результате появилось несколько проблем:

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


Более чем несколько инструментов интерпретируют эти байты как конец файла или другой специальный разделитель с неожиданными, непредвиденными и вообще неприятными эффектами. Однако документы обычно попадают в странные места в унаследованных системах, где никто не рассматривал и не понимал последствия ввода нового вина в старые бутылки.

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

Проблема «кракозябр» - проблема отображения документов в неправильной кодировке. Проблему можно было решить либо последовательным внедрением методов указания используемой кодировки, либо внедрением единой (общей) для всех кодировки.

Что говорят спецификации

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

Наконец, следует отметить, что идеографические сценарии, такие как китайский или японский, имеют тенденцию быть скупыми с персонажами по сравнению с алфавитными сценариями, такими как латинский или кириллический. Большое абсолютное число этих символов требует трех или более байтов на символ для полного представления этих скриптов; это означает, что одни и те же слова и предложения могут быть выражены в меньшем количестве символов, чем они выражены на таких языках, как английский и русский. Японская идеограмма æ £ ® по-прежнему занимает всего три байта.

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

Однако английский эквивалент «леса» занимает шесть. Тот, который изначально больше, будет иметь избыточность для сокращения алгоритма сжатия. Иногда это так, иногда это не так. Слишком много состояний следует отслеживать, чтобы знать, где находится последовательность. Если один байт потерян, все данные с этого момента будут повреждены.

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

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

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

В версиях до 0 исходные длинные имена переменных теряются, если файл данных сохраняется. Когда вы используете файлы данных со строковыми переменными более 255 байт в версиях до версии 0, эти строковые переменные фрагментируются в строковые переменные длиной 255 байт. Эта опция недоступна в режиме кодовой страницы. Если файл данных содержит более 500 переменных, сохраняются только первые 500. Для переменных с более чем одним потерянным пользователем значением, дополнительные потерянные пользователем значения будут перекодированы в первом из этих значений.

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

Использование 32-битных символов казалось слишком расточительным, поэтому было решено использовать 16-битные.

Имена переменных ограничены восемью байтами и при необходимости будут преобразованы в восьмибайтовые уникальные имена. В разделе «Общие параметры». Обозначает вкладки. Вы можете сохранять файлы в Юникоде или в кодировке локальной кодовой страницы. Обозначается запятыми. Текстовые файлы со значениями, разделенными запятыми или точками с запятой. Если текущий десятичный индикатор является запятой, значения разделяются точкой с запятой.

Текстовые файлы с фиксированным форматом, используя форматы записи по умолчанию для всех переменных. Между переменными полями нет вкладок или пробелов. Максимальное количество переменных - 000, остальные дополнительные переменные выше этого числа исключаются. Если в наборе данных содержится более миллиона случаев, в рабочей книге создается несколько листов.

Первая версия Юникода представляла собой кодировку с фиксированным размером символа в 16 бит, то есть общее число кодов было 2 16 (65 536). С тех пор символы стали обозначать четырьмя шестнадцатеричными цифрами (например, U+04F0 ). При этом в Юникоде планировалось кодировать не все существующие символы, а только те, которые необходимы в повседневном обиходе. Редко используемые символы должны были размещаться в «области пользовательских символов» (private use area ), которая первоначально занимала коды U+D800…U+F8FF .

Если набор данных содержит более 356 экземпляров, в рабочей книге создается несколько листов. Максимальное количество переменных, которые вы можете сохранить. Пустые пробелы или не буквенно-цифровые символы, отличные от подчеркивания, недопустимы, и имена должны начинаться с буквы или подчеркивания, после чего могут появляться цифры.

Как насчет двоичных данных, например изображений?

Если возможно, обновите до последней версии; вы должны использовать хотя бы версию 1. В учебнике и часто задаваемых вопросах вы должны использовать самую последнюю версию. Вы также должны проверить модули и обновить их, если это необходимо. Однако вам не следует комбинировать текстовые строки с двоичными строками. Если вам нужен текст в двоичной последовательности, закодируйте текстовые строки с надлежащей кодировкой, а затем присоедините их к двоичным строкам.

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

В дальнейшем, однако, было принято решение кодировать все символы и в связи с этим значительно расширить кодовую область.

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

Если кодировка не является латинской-1, результат преобразования данных не будет тем, что ожидалось. Неявное декодирование происходит без уведомления, называемого «продвижение». Возможно, это название предлагает что-то положительное, но лучше предотвратить его.

Есть ли способ автоматически декодировать или кодировать?

Явно код, чтобы избежать странных ошибок и для программистов, которые собираются сохранить код, видят, что они все думали. Если вы это сделаете, вы не забудете повторно декодировать или закодировать вещи, которые используют дескриптор файла со слоем. Вы можете применить этот слой при открытии файла с открытым.

Поскольку в ряде компьютерных систем (например, Windows NT) фиксированные 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 можно отобразить только 2 20 +2 16 −2048 (1 112 064) символов, то это число и было выбрано в качестве окончательной величины кодового пространства Юникода (диапазон кодов: 0×000000-0x10FFFF).

Хотя кодовая область Юникода была расширена за пределы 2 16 уже в версии 2.0, первые символы в «верхней» области были размещены только в версии 3.1.

Какая кодировка фактически используется для внутреннего формата?

Вы найдете подробную информацию о кодировке. Это хороший знак, так как вы не должны ожидать, что внутренний формат будет иметь определенную кодировку. Вкратце: не пытайтесь выяснить, что такое внутреннее кодирование данной строки; вам просто нужно закодировать его с нужной кодировкой. Хоакин Ферреро Энрике Нелл. . Проблема связана не с операторами, а с мобильными производителями. Алфавит, с которым работает большинство мобильных телефонов, не распознает несколько букв с тильдой.

Роль этой кодировки в веб-секторе постоянно растёт. На начало 2010 доля веб-сайтов, использующих Юникод, составила около 50 %.

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

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

Первый стандарт выпущен в 1991 году, последний - в 2016, следующий ожидается летом 2017 года. Стандарты версий 1.0-5.0 публиковались как книги, и имеют ISBN.

Происхождение проблемы не встречается у телефонных операторов, а у мобильных производителей. И одно 160-символьное сообщение выставляется как три сообщения. Проблема не затрагивает всех букв с акцентом или всех умляутов. Аналогичная проблема возникает и с умлаутами.

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

Номер версии стандарта составлен из трёх цифр (например, «4.0.1»). Третью цифру меняют при внесении в стандарт небольших изменений, не добавляющих новых символов.

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

Хотя формы записи UTF-8 и UTF-32 позволяют кодировать до 2 31 (2 147 483 648) кодовых позиций, было принято решение использовать лишь 1 112 064 для совместимости с UTF-16. Впрочем, даже и этого на текущий момент более чем достаточно - в версии 6.0 используется чуть менее 110 000 кодовых позиций (109 242 графических и 273 прочих символа).

Кодовое пространство разбито на 17 плоскостей (англ. planes ) по 2 16 (65 536) символов. Нулевая плоскость (plane 0 ) называется базовой (basic ) и содержит символы наиболее употребительных письменностей. Остальные плоскости - дополнительные (supplementary ). Первая плоскость (plane 1 ) используется в основном для исторических письменностей, вторая (plane 2 ) - для редко используемых иероглифов китайского письма (ККЯ), третья (plane 3 ) зарезервирована для архаичных китайских иероглифов. Плоскости 15 и 16 выделены для частного употребления.

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

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

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

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

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

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

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

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

Консорциум не создаёт нового, а констатирует сложившийся порядок вещей. Например, картинки «эмодзи» были добавлены потому, что японские операторы мобильной связи широко их использовали.

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

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

Как только символ появился в кодировке, он никогда не сдвинется и не исчезнет. Если же потребуется изменить порядок символов, это делается не переменой позиций, а национальным порядком сортировки. Есть и другие, более тонкие гарантии стабильности - например, не будут меняться таблицы нормализации.

Объединение и дублирование символов

Один и тот же символ может иметь несколько форм; в Юникод эти формы входят одной кодовой позицией:

  • если это сложилось исторически. Например, у арабских букв есть четыре формы: обособленная, в начале, в середине и в конце;
  • либо если в одном языке принята одна форма, а в другом - другая. Болгарская кириллица отличается от русской, а китайские иероглифы - от японских.

С другой стороны, если исторически в шрифтах были две разных кодовых позиции, они остаются разными и в Юникоде. Строчная греческая сигма имеет две формы, и у них разные позиции. Буква расширенной латиницы Å (A с кружком ) и знак ангстрема Å, греческая буква μ и обозначение приставки «микро-» µ - разные символы.

Конечно же, похожие символы в неродственных письменностях ставятся в разные кодовые позиции. Например, буква А в латинице, кириллице, греческом и чероки - разные символы.

Крайне редко один и тот же символ ставится в две разные кодовые позиции для упрощения обработки текста. Математический штрих и такой же штрих для индикации мягкости звуков - разные символы, второй считается буквой.

Модифицирующие символы

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

Графические символы в Юникоде подразделяются на протяжённые и непротяжённые (бесширинные). Непротяжённые символы при отображении не занимают места в строке. К ним относятся, в частности, знаки ударения и прочие диакритические знаки. Как протяжённые, так и непротяжённые символы имеют собственные коды. Протяжённые символы иначе называются базовыми (англ. base characters ), а непротяжённые - модифицирующими (англ. combining characters ); причём последние не могут встречаться самостоятельно. Например, символ «á» может быть представлен как последовательность базового символа «a» (U+0061) и модифицирующего символа « ́» (U+0301) или как монолитный символ «á» (U+00E1).

Особый тип модифицирующих символов - селекторы варианта начертания (англ. variation selectors ). Они действуют только на те символы, для которых такие варианты определены. В версии 5.0 варианты начертания определены для ряда математических символов, для символов традиционного монгольского алфавита и для символов монгольского квадратного письма.

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

Поскольку одни и те же символы можно представить различными кодами, сравнение строк байт за байтом становится невозможным. Алгоритмы нормализации (англ. normalization forms ) решают эту проблему, выполняя приведение текста к определённому стандартному виду.

Приведение осуществляется путём замены символов на эквивалентные с использованием таблиц и правил. «Декомпозицией» называется замена (разложение) одного символа на несколько составляющих символов, а «композицией», наоборот, - замена (соединение) нескольких составляющих символов на один символ.

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

NFD

NFD, англ. n ormalization f orm D («D» от англ. d ecomposition ), форма нормализации D - каноническая декомпозиция - алгоритм, согласно которому выполняется рекурсивная замена монолитных символов (англ. precomposed characters ) на несколько составных (англ. composite characters ) в соответствии с таблицами декомпозиции.

Å
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, англ. n ormalization f orm C («C» от англ. c omposition ), форма нормализации C - алгоритм, согласно которому последовательно выполняются каноническая декомпозиция и каноническая композиция. Сначала каноническая декомпозиция (алгоритм NFD) приводит текст к форме D. Затем каноническая композиция - операция, обратная NFD, обрабатывает текст от начала к концу с учётом следующих правил:

  • символ S считается начальным , если имеет класс модификации равный нулю согласно таблице символов Юникода;
  • в любой последовательности символов, начинающейся с символа S , символ C блокируется от S , только если между S и C есть какой-либо символ B , который либо является начальным, либо имеет одинаковый или больший класс модификации, чем C . Это правило распространяется только на строки, прошедшие каноническую декомпозицию;
  • символ считается первичным композитом, если имеет каноническую декомпозицию в таблице символов Юникода (или каноническую декомпозицию для хангыля и он не входит в список исключений);
  • символ X может быть первично совмещён с символом Y , если и только если существует первичный композит Z , канонически эквивалентный последовательности <X , Y >;
  • если очередной символ C не блокируется последним встреченным начальным базовым символом L и он может быть успешно первично совмещён с ним, то L заменяется на композит L-C , а C удаляется.
o
U+006F
̂
U+0302
H
U+0048
U+2460
1
U+0031
U+FF76
U+30AB
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

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

Стандарт Юникод поддерживает письменности языков как с направлением написания слева направо (англ. left-to-right, LTR ), так и с написанием справа налево (англ. right-to-left, RTL ) - например, арабское и еврейское письмо. В обоих случаях символы хранятся в «естественном» порядке; их отображение с учётом нужного направления письма обеспечивается приложением.

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

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


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

Юникод включает практически все современные письменности, в том числе:

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

и другие.

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

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

В Юникод принципиально не включаются государственные флаги, логотипы компаний и продуктов, хотя они и встречаются в шрифтах (например, логотип Apple в кодировке MacRoman (0xF0) или логотип Windows в шрифте Wingdings (0xFF)). В юникодовских шрифтах логотипы должны размещаться только в области пользовательских символов.

ISO/IEC 10646

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

Сотрудничество Консорциума Юникода с Международной организацией по стандартизации (англ. International Organization for Standardization, ISO ) началось в 1991 году. В 1993 году ISO выпустила стандарт DIS 10646.1. Для синхронизации с ним Консорциум утвердил стандарт Юникода версии 1.1, в который были внесены дополнительные символы из DIS 10646.1. В результате значения закодированных символов в Unicode 1.1 и DIS 10646.1 полностью совпали.

В дальнейшем сотрудничество двух организаций продолжилось. В 2000 году стандарт Unicode 3.0 был синхронизирован с ISO/IEC 10646-1:2000. Предстоящая третья версия ISO/IEC 10646 будет синхронизирована с Unicode 4.0. Возможно, эти спецификации даже будут опубликованы как единый стандарт.

Аналогично форматам UTF-16 и UTF-32 в стандарте Юникода, стандарт ISO/IEC 10646 также имеет две основные формы кодирования символов: UCS-2 (2 байта на символ, аналогично UTF-16) и UCS-4 (4 байта на символ, аналогично UTF-32). UCS значит универсальный многооктетный (многобайтовый) кодированный набор символов (англ. universal multiple-octet coded character set ). UCS-2 можно считать подмножеством UTF-16 (UTF-16 без суррогатных пар), а UCS-4 является синонимом для UTF-32.

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

  • небольшие различия в терминологии;
  • 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).

В 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 - представление Юникода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими 8-битные символы.

Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом.

Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байт (на деле, только до 4 байт, поскольку в Юникоде нет символов с кодом больше 10FFFF, и вводить их в будущем не планируется), в которых первый байт всегда имеет вид 11xxxxxx , а остальные - 10xxxxxx . В UTF-8 не используются суррогатные пары, 4 байтов достаточно для записи любого символа юникода.

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

Символы UTF-8 получаются из Unicode следующим образом:

Unicode UTF-8: 0x00000000 - 0x0000007F: 0xxxxxxx 0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx 0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Теоретически возможны, но не включены в стандарт также:

0x00200000 - 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0x04000000 - 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

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

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

В потоке данных UTF-16 младший байт может записываться либо перед старшим (англ. UTF-16 little-endian ), либо после старшего (англ. UTF-16 big-endian ). Аналогично существует два варианта четырёхбайтной кодировки - UTF-32LE и UTF-32BE.

Для определения формата представления Юникода в начало текстового файла записывается сигнатура - символ U+FEFF (неразрывный пробел с нулевой шириной), также именуемый маркером последовательности байтов (англ. byte order mark (BOM) ). Это позволяет различать UTF-16LE и UTF-16BE, поскольку символа U+FFFE не существует. Также этот способ иногда применяется для обозначения формата UTF-8, хотя к этому формату и неприменимо понятие порядка байтов. Файлы, следующие этому соглашению, начинаются с таких последовательностей байтов:

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

К сожалению, этот способ не позволяет надёжно различать UTF-16LE и UTF-32LE, поскольку символ U+0000 допускается Юникодом (хотя реальные тексты редко начинаются с него).

Файлы в кодировках UTF-16 и UTF-32, не содержащие BOM, должны иметь порядок байтов big-endian (unicode.org).

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

Внедрение Юникода привело к изменению подхода к традиционным 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 или два (см. суррогатная пара).

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

Методы ввода

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

Microsoft Windows

Хотя начиная с Windows 2000, служебная программа «Таблица символов» (charmap.exe) поддерживает символы Юникода и позволяет копировать их в буфер обмена, но эта поддержка ограничена только базовой плоскостью (коды символов U+0000…U+FFFF). Символы с кодами от U+10000 «Таблица символов» не отображает.

Похожая таблица есть, например, в Microsoft Word.

Иногда можно набрать шестнадцатеричный код, нажать Alt + X , и код будет заменён на соответствующий символ, например, в WordPad, Microsoft Word. В редакторах Alt + X выполняет и обратное преобразование.

Во многих программах MS Windows, чтобы получить символ Unicode, нужно при нажатой клавише Alt набрать десятичное значение кода символа на цифровой клавиатуре. Например, полезными при наборе кириллических текстов будут комбинации Alt+0171 («), Alt+0187 (») и Alt+0769 (знак ударения). Интересны также комбинации Alt+0133 (…) и Alt+0151 (-).

Macintosh

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

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

GNU/Linux

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

Все приложения X Window, включая GNOME и KDE, поддерживают ввод при помощи клавиши Compose . Для клавиатур, на которых нет отдельной клавиши Compose, для этой цели можно назначить любую клавишу - например, ⇪ Caps Lock .

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

Mozilla Firefox для Linux поддерживает ввод символов по ISO 14755.

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

В Юникоде английское «a» и польское «a» - один и тот же символ. Точно так же одним и тем же символом (но отличающимся от «a» латинского) считаются русское «а» и сербское «а». Такой принцип кодирования не универсален; по-видимому, решения «на все случаи жизни» вообще не может существовать.

  • Тексты на китайском, корейском и японском языках имеют традиционное написание сверху вниз, начиная с правого верхнего угла. Переключение горизонтального и вертикального написания для этих языков не предусмотрено в Юникоде - это должно осуществляться средствами языков разметки или внутренними механизмами текстовых процессоров.
  • Юникод предусматривает возможность разных начертаний одного и того же символа в зависимости от языка. Так, китайские иероглифы могут иметь разные начертания в китайском, японском (кандзи) и корейском (ханча), но при этом в Юникоде обозначаются одним и тем же символом (так называемая CJK-унификация), хотя упрощённые и полные иероглифы всё же имеют разные коды. Аналогично, русский и сербский языки используют разное начертание курсивных букв п и т (в сербском они выглядят как и и ш , см. сербский курсив). Поэтому нужно следить, чтобы текст всегда был правильно помечен как относящийся к тому или другому языку.
  • Перевод из строчных букв в заглавные тоже зависит от языка. Например: в турецком существуют буквы İi и Iı - таким образом, турецкие правила изменения регистра конфликтуют с английскими, которые предписывают «i» переводить в «I». Подобные проблемы есть и в других языках - например, в канадском диалекте французского языка регистр переводится немного не так, как во Франции.
  • Даже с арабскими цифрами есть определённые типографские тонкости: цифры бывают «прописными» и «строчными», пропорциональными и моноширинными - для Юникода разницы между ними нет. Подобные нюансы остаются за программным обеспечением.

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

  • Файлы нелатинского текста в Юникоде всегда занимают больше места, так как один символ кодируется не одним байтом, как в различных национальных кодировках, а последовательностью байтов (исключение составляет UTF-8 для языков, алфавит которых укладывается в ASCII, а также наличие в тексте символов двух и более языков, алфавит которых не укладывается в ASCII). Файл шрифта, необходимый для отображения всех символов таблицы Юникод, занимает сравнительно много места в памяти и требует бо́льших вычислительных ресурсов, чем шрифт только одного национального языка пользователя. С увеличением мощности компьютерных систем и удешевлением памяти и дискового пространства эта проблема становится всё менее существенной; тем не менее, она остаётся актуальной для портативных устройств, например, для мобильных телефонов.
  • Хотя поддержка Юникода реализована в наиболее распространённых операционных системах, до сих пор не всё прикладное программное обеспечение поддерживает корректную работу с ним. В частности, не всегда обрабатываются метки порядка байтов (BOM) и плохо поддерживаются диакритические символы. Проблема является временной и есть следствие сравнительной новизны стандартов Юникода (в сравнении с однобайтовыми национальными кодировками).
  • Производительность всех программ обработки строк (в том числе и сортировок в БД) снижается при использовании Юникода вместо однобайтовых кодировок.

Некоторые редкие системы письма всё ещё не представлены должным образом в Юникоде. Изображение «длинных» надстрочных символов, простирающихся над несколькими буквами, как, например, в церковнославянском языке, пока не реализовано.

«Юникод» или «Уникод»?

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

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

Написание «Юникод» уже твёрдо вошло в русскоязычные тексты. В Википедии используется более распространённый вариант. В MS Windows используется вариант «Юникод».

На сайте Консорциума есть специальная страница, где рассматриваются проблемы передачи слова «Unicode» в различных языках и системах письма. Для русской кириллицы указан вариант «Юникод».

Проблемы, связанные с кодировками, обычно берёт на себя программное обеспечение, поэтому обычно не возникает никаких сложностей с использованием кодировок. Если же сложности возникают, то они обычно порождаются плохими программами — смело отправляйте их в корзину.

Приглашаю всех высказываться в

Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (англ. Unicode Consortium, Unicode Inc.). Применение этого стандарта позволяет закодировать очень большое число символов из разных письменностей: в документах Unicode могут соседствовать китайские иероглифы, математические символы, буквы греческого алфавита, латиницы и кириллицы, при этом становится ненужным переключение кодовых страниц.

Стандарт состоит из двух основных разделов: универсальный набор символов (англ. UCS, universal character set) и семейство кодировок (англ. UTF, Unicode transformation format). Универсальный набор символов задаёт однозначное соответствие символов кодам - элементам кодового пространства, представляющим неотрицательные целые числа. Семейство кодировок определяет машинное представление последовательности кодов UCS.

Стандарт Unicode был разработан с целью создания единой кодировки символов всех современных и многих древних письменных языков. Каждый символ в этом стандарте кодируется 16 битами, что позволяет ему охватить несравненно большее количество символов, чем принятые ранее 8-битовые кодировки. Еще одним важным отличием Unicode от других систем кодировки является то, что он не только приписывает каждому символу уникальный код, но и определяет различные характеристики этого символа, например:

Тип символа (прописная буква, строчная буква, цифра, знак препинания и т.д.);

Атрибуты символа (отображение слева направо или справа налево, пробел, разрыв строки и т.д.);

Соответствующая прописная или строчная буква (для строчных и прописных букв соответственно);

Соответствующее числовое значение (для цифровых символов).

Весь диапазон кодов от 0 до FFFF разбит на несколько стандартных подмножеств, каждое из которых соответствует либо алфавиту какого-то языка, либо группе специальных символов, сходных по своим функциям. На приведенной ниже схеме содержится общий перечень подмножеств Unicode 3.0 (рисунок 2).

Рисунок 2

Стандарт Unicode является основой для хранения и текста во многих современных компьютерных системах. Однако, он не совместим с большинством Интернет-протоколов, поскольку его коды могут содержать любые байтовые значения, а протоколы обычно используют байты 00 - 1F и FE - FF в качестве служебных. Для достижения совместимости были разработаны несколько форматов преобразования Unicode (UTFs, Unicode Transformation Formats), из которых на сегодня наиболее распространенным является UTF-8. Этот формат определяет следующие правила преобразования каждого кода Unicode в набор байтов (от одного до трех), пригодных для транспортировки Интернет-протоколами.

Здесь x,y,z обозначают биты исходного кода, которые должны извлекаться, начиная с младшего, и заноситься в байты результата справа налево, пока не будут заполнены все указанные позиции.

Дальнейшее развитие стандарта Unicode связано с добавлением новых языковых плоскостей, т.е. символов в диапазонах 10000 - 1FFFF, 20000 - 2FFFF и т.д., куда предполагается включать кодировку для письменностей мертвых языков, не попавших в таблицу, приведенную выше. Для кодирования этих дополнительных символов был разработан новый формат UTF-16.

Таким образом, существует 4 основных способа кодировки байтами в формате Unicode:

UTF-8: 128 символов кодируются одним байтом (формат ASCII), 1920 символов кодируются 2-мя байтами ((Roman, Greek, Cyrillic, Coptic, Armenian, Hebrew, Arabic символы), 63488 символов кодируются 3-мя байтами (Китайский, японский и др.) Оставшиеся 2 147 418 112 символы (еще не использованы) могут быть закодированы 4, 5 или 6-ю байтами.

UCS-2: Каждый символ представлен 2-мя байтами. Данная кодировка включает лишь первые 65 535 символов из формата Unicode.

UTF-16:Является расширением UCS-2, включает 1 114 112 символов формата Unicode. Первые 65 535 символов представлены 2-мя байтами, остальные - 4-мя байтами.

USC-4: Каждый символ кодируется 4-мя байтами.