UNICODE(7)

ИМЯ
unicode - универсальный набор символов

ОПИСАНИЕ
Universal Character Set (UCS) (универсальный набор символов — Юникод) определён в международном стандарте ISO 10646. UCS содержит все символы других стандартов. Его использование гарантирует «полную взаимозаменяемость», другими словами, таблицы для преобразований могут быть построены таким образом, что не произойдёт потери информации при преобразовании строки из сторонней кодировки в UCS и обратно.

UCS содержит символы, необходимые для представления практически всех известных сейчас языковых символов. В него включены не только языковые символы из латинской, греческой, кириллицы, иврита, арабской, армянской, грузинской письменности, но и китайские, японские и корейские идеограммы, а также символы из таких письменностей как хирагана, катакана, хангул, деванагари, бенгальской, гурмуки, гуджарати, ория, тамильской, телугской, каннада, малаяламской, тайской, лаосской, кхмерской, бопомофо, тибетской, рунической, эфиопской, канадского слогового письма, чероки, монгольской, охамской, мьянмарской, синхальской,таанской, юи и других. По ещё не включённым письменностям постоянно ведутся работы для поиска их самой оптимальной кодировки для компьютеров и добавлении. К ним относятся не только различные иероглифы и письменности из индо-европейской исторической группы, но и некоторые искусственные языки, такие как тенгвар, сирт и клингонский. Также UCS содержит большое множество графических, типографических, математических и научных символов, используемых в таких программах, как TeX, Postscript, APL, MS-DOS, MS-Windows, Macintosh, шрифтах OCR и многих других текстовых процессорах и издательских системах.

Стандарт UCS (ISO 10646) описывает 31-битную архитектуру набора символов, состоящую из 128 24-битных групп, каждая из которых разделена на 256 16-битных плоскостей, которые, в свою очередь, состоят из 256 8-битных строк и 256 колонок, каждая для одного символа. В 1 части стандарта (ISO 10646-1) определяются первые 65534 кодируемых позиций (с 0x0000 по 0xfffd), каждая из которых образует Basic Multilingual Plane (BMP) (основную многоязычную матрицу), являющуюся плоскостью 0 в группе 0. В 2 части стандарта (ISO 10646-2) добавляются символы, не вошедшие в BMP, в некоторые дополнительные плоскости в диапазоне от 0x10000 до 0x10ffff группы 0. Пока нет планов по добавлению символов за предел 0x10ffff в существующий стандарт, поэтому в обозримом будущем во всём закодированном пространстве в действительности будет использоваться только малая часть группы 0. BMP содержит все символы, используемые в других наборах символов. Дополнительные плоскости, добавляемые ISO 10646-2 покрывают некоторые особенные, специальные и экзотические символы, используемые в науке, при печати словарей, издательской индустрии, протоколах высокого уровня и некоторыми энтузиастами.

Представление каждого символа в UCS в виде -байтного слова называют формой UCS-2 (только для символов BMP), UCS-4 называют представление каждого символа 4-байтным словом. Также существуют 2 формы кодировки: UTF-8 — для совместимости со старым ПО, работающим с кодировкой ASCII, и UTF-16 — для совместимости с ПО, работающим с кодировкой UCS-2, для не BMP символов до 0x10ffff позиции.

Символы UCS от 0x0000 до 0x007f идентичны обычному набору символов US-ASCII, а символы в диапазоне от 0x0000 до 0x00ff идентичны символам ISO 8859-1 (Latin-1).

  Комбинирующие символы
Некоторые позиции в UCS зарезервированы для комбинирующих символов. Они аналогичны клавишам печатной машинки, которые служат для набора букв с ударением. Комбинирующий символ лишь добавляет ударение к предыдущему символу. Наиболее употребляемые символы, требующие ударения, имеют собственный код в UCS, однако комбинирующий символ позволяет добавить ударение или другой диакритический знак к любому символу. Комбинирующие символы всегда указываются после буквы, которую они изменяют. Например, немецкий символ «умляут-А» (латинская заглавная буква А с диерезой) может быть представлен как зарезервированный специальный символ UCS с кодом 0x00c4, или как комбинация обыкновенной «латинской заглавной буквы А» и последующей «комбинирующей диерезы: 0x0041 0x0308.

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

  Уровни реализации
Так как не все системы могут поддерживать такой сложный механизм, как реализацию комбинирующих символов, стандарт ISO 10646-1 предусматривает следующие три уровня реализации UCS:

Уровень 1
    Комбинирующие символы и символы Hangul Jamo (вариант кодировки корейского письма, где слоги хангыль кодируются по два или по три гласных кода) не поддерживаются.

Уровень 2
    В дополнении к символам уровня 1 комбинирующие символы разрешено использовать для некоторых языков, в которых они важны (например: тайский, лаосский, иврит, арабский, деванагари, малаяламский).

Уровень 3
    Поддерживаются все символы UCS.

Стандарт Unicode 3.0, опубликованный Unicode Consortium, содержит точную реализацию UCS Basic Multilingual Plane на уровне 3, как описано в стандарте ISO 10646-1:2000. В Unicode 3.1 добавлены дополнительные плоскости ISO 10646-2. Стандарт Юникода и технические сообщения, публикуемые Unicode Consortium, предоставляют много дополнительной информации по семантике и рекомендации по использованию разных символов. Также поясняются принципы и алгоритмы для редактирования, сортировки, сравнения, нормализации, преобразования и вывода строк Юникода.

  Юникод в Linux
В системах GNU/Linux тип языка Cи wchar_t является 32-битным знаковым целым типом. Его значения всегда интерпретируются библиотекой Си как значения кодов UCS (во всех локалях); в этом случае, согласно стандарту ISO C99, библиотека GNU C определяет константу __STDC_ISO_10646__.

UCS/Unicode может использоваться подобно ASCII в потоках ввода/вывода, соединениях с терминалами, в текстовых файлах, названиях файлов и в переменных окружения в виде многобайтовой кодировке UTF-8, совместимой с ASCII. Для обозначения использования UTF-8 как кодировки во всех приложениях должна быть выбрана подходящая локаль через переменные окружения (например, «LANG=ru_RU.UTF-8»).

Функция nl_langinfo(CODESET) возвращает название выбранной кодировки. Библиотечные функции, такие как wctomb(3) и mbsrtowcs(3), могут использоваться для преобразования внутренних символов wchar_t и строк в кодировку системных символов и наоборот; wcwidth(3) определяет, на сколько позиций (0–2) сместился курсор при выводе символа.

  Закрытые используемые области (Private Use Areas, PUA)
В основной многоязычной матрице диапазон с 0xe000 до 0xf8ff никогда не будет использован для обозначения стандартных символов, он зарезервирован для частного использования. В Linux эта закрытая область делится на: диапазон 0xe000 по 0xefff может использоваться конечным пользователем; диапазон 0xf000 по 0xf8ff (так называемая зона Linux) может использоваться для расширений, согласованных среди пользователей Linux. В настоящее время регистрацией символов в зоне Linux занимается LANANA, а сам реестр находится в файле Documentation/admin-guide/unicode.rst исходного кода ядра Linux (в Documentation/unicode.txt до Linux 4.10).

Две другие плоскости зарезервированы для закрытого использования, плоскость 15 (дополнительная закрытая используемая область-A, диапазон от 0xf0000 до 0xffffd) и плоскость 16 (дополнительная закрытая используемая область-B, диапазон от 0x100000 до 0x10fffd).

  Литература

*   Information technology — Universal Multiple-Octet Coded Character Set (UCS) — Part 1: Architecture and Basic Multilingual Plane. International Standard ISO/IEC 10646-1, International Organization for Standardization, Geneva, 2000.

    Официальная спецификация UCS. Доступна с http://www.iso.ch/.

*   The Unicode Standard, Version 3.0. The Unicode Consortium, Addison-Wesley, Reading, MA, 2000, ISBN 0-201-61633-5.

*   S. Harbison, G. Steele. C: A Reference Manual. Fourth edition, Prentice Hall, Englewood Cliffs, 1995, ISBN 0-13-326224-3.

    Хорошая книга о программировании на языке Си. Четвёртое издание включает в себя описание поправки 1, сделанной в стандарте ISO C90 в 1994 году. Эта поправка добавляет к стандарту большое количество новых библиотечных функций Си для поддержки кодирования широких и многобайтовых символов, но она не так полна как стандарт ISO C99, который расширяет поддержку широких и многобайтовых символов.

*   Unicode Technical Reports.
    http://www.unicode.org/reports/

*   Markus Kuhn: UTF-8 and Unicode FAQ for UNIX/Linux.
    http://www.cl.cam.ac.uk/~mgk25/unicode.html

*   Bruno Haible: Unicode HOWTO.
    http://www.tldp.org/HOWTO/Unicode-HOWTO.html

СМОТРИТЕ ТАКЖЕ
locale(1), setlocale(3), charsets(7), utf-8(7)