Кодировка "Юникод": стандарт кодирования символов с описанием

0
0

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

История создания стандарта Юникод

В конце 1980-х годов остро встал вопрос о едином стандарте кодирования текста. Существовало множество 8-битных кодировок, постоянно появлялись новые. Это создавало следующие проблемы:

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

Было принято решение о создании универсальной «широкой» 16-битной кодировки, охватывающей символы всех известных систем письма. Так в 1991 году появился стандарт Юникод (Unicode), разработанный консорциумом Unicode Consortium.

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

С 1993 года ведется сотрудничество Unicode Consortium с Международной организацией по стандартизации (ISO) по синхронизации стандарта Юникод и стандарта ISO/IEC 10646.

Принципы устройства Юникода

Кодировка Юникод состоит из двух частей:

  1. Универсальный набор символов (UCS), который перечисляет все допустимые символы.
  2. Семейство кодировок (UTF), определяющих способы записи этих символов.

Кодовое пространство Юникода разбито на 17 плоскостей по 65 536 позиций в каждой. Первая, нулевая плоскость является базовой и содержит наиболее употребительные символы. Всего в Юникоде можно закодировать до 1 112 064 символов.

Для обозначения кодов используется запись вида:

U+xxxx - для кодов от 0 до 65535 (4 шестнадцатеричные цифры)

Например, код русской буквы "а" имеет обозначение U+0430.

Символы в Юникоде делятся на базовые и комбинирующие. Последние (например, знаки ударения) следуют за базовым символом и изменяют его отображение. Благодаря комбинирующим символам, один и тот же символ можно закодировать разными последовательностями кодов.

Виды текстовых данных в Юникоде

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

Графические символы включают в себя:

  • Буквы
  • Цифры
  • Знаки пунктуации
  • Математические и музыкальные символы
  • Идеограммы и логограммы (например, иероглифы)

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

Как было сказано выше, в Юникоде есть составные и монолитные символы. Пример составного символа на кириллице – это буква "Й", которую можно закодировать как:

  • Базовый символ "И" (U+0418)
  • Комбинирующий знак "̆" (U+0306) над буквой

Монолитный эквивалент этого символа имеет код U+0419.

Существование составных символов приводит к проблеме сравнения строк в Юникоде. Для решения этой проблемы в стандарте определены алгоритмы нормализации текста (NFC, NFKC и др.), унифицирующие представление символов.

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

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

  • Кириллица
  • Латиница
  • Греческий алфавит
  • Арабское письмо
  • Иврит

Кроме того, для академических целей добавлены многие исторические письменности:

  • Клинопись
  • Иероглифы майя
  • Древнеегипетские иероглифы
  • Германские руны

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

Для кодирования флагов стран используются специальные пары букв региональных индикаторов.

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

Для хранения кодов символов Юникода используются различные форматы представления данных или кодировки UTF (Unicode Transformation Format). Наиболее распространены:

  • UTF-8 – переменная длина кодировки (от 1 до 4 байт на символ). Обеспечивает совместимость с 7-битной кодировкой ASCII.
  • UTF-16 – использует 16-битные коды, прямо соответствующие кодам Юникода в диапазоне U+0000...U+FFFF. Для остальных символов применяются суррогатные пары (2 кода по 16 бит).
  • UTF-32 – каждый символ кодируется 4 байтами.

Для UTF-16 и UTF-32 определены варианты с прямым (BE) и обратным (LE) порядком байтов. Часто в начале текста помещается специальный маркер, определяющий формат Юникода.

Ввод произвольных символов Юникода

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

В операционных системах Windows и Mac OS предусмотрен ввод шестнадцатеричного кода символа с помощью клавиатурных комбинаций. В Linux можно также использовать стандарт ISO 14755 и вводить код Ctrl+Shift+U, а затем шестнадцатеричные цифры.

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

Поддержка Юникода в программах и ОС

В современных операционных системах реализована поддержка Юникода.

В Windows NT и последующих для хранения строк используется кодировка Юникод UTF-16LE. В UNIX-подобных ОС (Linux, macOS, BSD) принят формат UTF-8.

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

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

Центр обработки юникода

Преимущества Юникода

Главное достоинство универсального стандарта кодировки Юникод – это возможность представления текстов на разных языках и письменностях в едином формате. Это упрощает перенос данных между различными системами и программами.

Кодирование по правилам Юникода также экономит память, поскольку для всех шрифтов используется общая таблица символов.

Перекодирование из одной 8-битной кодировки в другую становится проще – достаточно задать таблицы соответствия символов кодировок Юникоду.

Недостатки и ограничения

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

Далеко не всякий обработчик текстов может корректно работать с двунаправленными текстами, суррогатными парами и другими сложными вариантами кодирования символов.

Кодировка Юникод и возможности передачи данных

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

Для передачи небольших текстовых сообщений удобен компактный UTF-8. А UTF-32, напротив, избыточен по размеру, зато обеспечивает простоту доступа к отдельным символам.

При передачи сообщения по узкому каналу связи имеет смысл преобразовать текст в UTF-8, или в крайнем случае, в UTF-16. Это позволит сократить объем данных по сравнению с UTF-32.

Древнеегипетские иероглифы

Языки программирования и Юникод

Поддержка Юникода встроена во многие популярные языки программирования. Например, в Python 3 строки хранятся в формате UTF-8. Есть удобные функции для работы с Юникод-строками.

В PHP также можно легко получить символ по коду Юникода или вывести коды символов строки. Преобразование 8-битных строк в UTF-8 выполняется автоматически.

// PHP $text = "Пример текста"; echo mb_detect_encoding($text); // UTF-8 echo ord($text[0]); // U+041f

Язык Си не имеет встроенных Юникод-строк. Но поддержку Юникода можно добавить с помощью специальных библиотек, например ICU (International Components for Unicode).

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

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

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

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

Проблемы локализации

Несмотря на то, что Юникод объединяет большинство письменностей, он не решает все вопросы локализации текстов.

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

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

Расширение поддержки редких письменностей

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

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

Улучшение алгоритмов обработки текста

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

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

Унификация национальных вариантов письменностей

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

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

Для решения этой проблемы ведется согласование единых правил адаптации алфавитов к национальным требованиям в рамках Юникода.

Стандартизация идентификаторов и метаданных

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

Сюда относятся, например, метки языка или региона, информация о направлении текста, идентификаторы шрифтов и т.д.

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

Расширенная поддержка в прикладных программах

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

Это касается, прежде всего, корректной работы со сложными особенностями Юникод-текстов – суррогатными парами, комбинирующими символами, разными правилами написания.