Юникод
Юникод (англ. Unicode) — это международный стандарт кодирования символов, позволяющий представлять текст, написанный на большинстве письменных систем мира, в виде последовательности цифровых кодов. В отличие от более ранних кодировок (например, ASCII или Windows-1251), которые были ограничены одним языком или группой языков, Юникод стремится охватить все используемые и исторические письменности, а также математические, музыкальные и другие специальные символы. Стандарт поддерживается консорциумом Unicode Consortium, некоммерческой организацией, объединяющей крупнейшие IT-компании, лингвистов и специалистов по типографике.
История создания
Предпосылки
До появления Юникода в компьютерных системах использовались десятки различных кодировок. Это создавало серьёзные проблемы при обмене данными: текст, корректно отображавшийся на одной системе, мог превратиться в «кракозябры» на другой. Попытки решить проблему с помощью универсальных кодировок (например, ISO 8859) были половинчатыми — они охватывали лишь несколько языков.
Разработка стандарта
Работа над Юникодом началась в конце 1980-х годов. В 1991 году был опубликован первый том стандарта Unicode 1.0. Изначально предполагалось, что для кодирования всех символов достаточно 16 бит (65536 кодовых позиций), однако по мере расширения охвата стало ясно, что этого недостаточно. Начиная с версии 2.0 (1996 год) была введена система суррогатных пар, позволившая использовать более миллиона кодовых позиций.
Текущее состояние
На момент 2024 года действует версия Unicode 16.0, включающая более 154 000 символов из 168 письменностей, включая такие редкие, как клинопись, египетские иероглифы, готское и огамическое письмо. Стандарт продолжает ежегодно обновляться.
Принципы кодирования
Кодовое пространство
Каждому символу Юникода присваивается уникальное целое число — кодовая точка (code point). Диапазон возможных значений составляет от 0 до 1 114 111 (0x10FFFF в шестнадцатеричной системе). Кодовые точки принято записывать в виде U+XXXX, где X — шестнадцатеричные цифры (например, U+0041 — латинская заглавная буква A, U+0410 — кириллическая заглавная буква А).
Плоскости
Кодовое пространство разделено на 17 плоскостей (planes) по 65536 позиций в каждой:
| Плоскость | Диапазон | Название | Содержание |
|---|---|---|---|
| 0 | U+0000 — U+FFFF | Основная многоязычная плоскость (BMP) | Наиболее употребительные письменности: латиница, кириллица, арабское письмо, иероглифы CJK, математические символы |
| 1 | U+10000 — U+1FFFF | Дополнительная многоязычная плоскость (SMP) | Исторические письменности, музыкальные ноты, эмодзи |
| 2 | U+20000 — U+2FFFF | Дополнительная плоскость идеограмм (SIP) | Редкие и исторические китайские иероглифы |
| 14 | U+E0000 — U+EFFFF | Дополнительная специальная плоскость (SSP) | Управляющие символы (теги, селекторы вариантов) |
| 15-16 | U+F0000 — U+10FFFF | Частные области (PUA) | Символы для внутреннего использования (не стандартизированы) |
Схемы кодирования (UTF)
Для хранения и передачи кодовых точек Юникода используются различные схемы преобразования (Unicode Transformation Format). Наиболее распространены:
- UTF-8 — переменная длина (от 1 до 4 байт на символ). Совместима с ASCII (первые 128 кодовых точек кодируются одним байтом). Наиболее популярная схема в вебе и UNIX-системах.
- UTF-16 — переменная длина (2 или 4 байта). Используется в Windows, Java, JavaScript. Символы BMP кодируются двумя байтами, остальные — четырьмя (суррогатными парами).
- UTF-32 — фиксированная длина (4 байта на символ). Проста для обработки, но неэффективна по памяти.
Классификация символов
Категории
Стандарт Юникод делит все символы на категории (General Category), обозначаемые двухбуквенными кодами:
- L (Letter) — буквы (Lu — заглавные, Ll — строчные, Lt — заглавные в начале слова, Lm — модификаторы, Lo — прочие)
- M (Mark) — диакритические знаки, объединяющие символы (Mn — неширинные, Mc — ширинные, Me — объемлющие)
- N (Number) — цифры (Nd — десятичные, Nl — буквенные, No — прочие)
- P (Punctuation) — знаки препинания
- S (Symbol) — символы (математические, валютные, модификаторы)
- Z (Separator) — разделители (пробелы, разрывы строк)
- C (Control) — управляющие символы
Блоки
Символы группируются в тематические блоки (blocks) по 16, 32, 64, 128 и более кодовых точек. Например, блок «Кириллица» (U+0400 — U+04FF) содержит буквы для славянских и неславянских языков, использующих кириллическую письменность.
Применение
В операционных системах
Современные версии Windows (начиная с Windows 2000), macOS, Linux и мобильных платформ (iOS, Android) полностью поддерживают Юникод. Это позволяет пользователям вводить, отображать и обрабатывать текст на любом языке без установки дополнительных кодировок.
В вебе
Юникод является основой для HTML, XML и JSON. Подавляющее большинство веб-сайтов используют кодировку UTF-8, что обеспечивает корректное отображение текста на любом языке в браузере.
В программировании
Большинство современных языков программирования (Python, Java, C#, JavaScript, Go, Rust) поддерживают Юникод на уровне строковых типов данных. Библиотеки для работы с текстом (регулярные выражения, сортировка, поиск) учитывают правила Юникода.
В базах данных
Реляционные базы данных (PostgreSQL, MySQL, SQL Server) поддерживают Юникодные типы данных (например, NVARCHAR в SQL Server, VARCHAR с кодировкой UTF-8 в PostgreSQL).
Критика и ограничения
Нормализация
Одна и та же строка может быть представлена разными последовательностями кодовых точек (например, буква «ё» может быть отдельным символом или сочетанием «е» + диакритический знак). Для решения этой проблемы стандарт определяет четыре формы нормализации (NFC, NFD, NFKC, NFKD), но не все приложения их корректно реализуют.
Эмодзи
Включение эмодзи в стандарт вызвало споры. Критики отмечают, что эмодзи — это не письменность, а пиктограммы, и их поддержка усложняет стандарт. Кроме того, разные платформы отображают один и тот же эмодзи по-разному, что может приводить к недопониманию.
Сложность обработки
Некоторые письменности (арабская, иврит, индийские) требуют сложной обработки: изменение формы символов в зависимости от контекста, реверсивное направление письма, визуальное переупорядочивание диакритических знаков. Не все программное обеспечение корректно реализует эти правила.
Политические аспекты
Решение о включении или невключении тех или иных символов в стандарт иногда вызывает споры. Например, долгое время не были включены символы для некоторых региональных письменностей, что воспринималось как дискриминация.
Интересные факты
- Самая большая письменность в Юникоде — китайские иероглифы (CJK Unified Ideographs), занимающие несколько десятков тысяч кодовых позиций.
- Символ «U+FFFC» (OBJECT REPLACEMENT CHARACTER) зарезервирован для встраивания объектов (например, изображений) в текст.
- В стандарте есть символы для обозначения несуществующих письменностей — например, клингонского языка из сериала «Звёздный путь» (в частной области).
- Первый символ Юникода — U+0000 (NULL) — управляющий символ, используемый для обозначения конца строки в некоторых языках программирования.
Источники
- The Unicode Standard, Version 16.0 (2024) — официальная спецификация консорциума Unicode.
- Юникод / Д. В. Сичинава // Большая российская энциклопедия (электронная версия, 2023).
- Статья «Unicode» в английской Википедии (версия от 15.10.2024) — использована как вторичный источник для проверки фактов.
- Материалы конференции «Unicode Conference» (2023) — доклады о новых символах и направлениях развития.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →