UNICODE(7)

НАЗВАНИЕ
Unicode - унифицированный набор символов

ОПИСАНИЕ
Международный стандарт ISO 10646 дает определение Universal Character Set (UCS) (Универсальный Набор Символов - Уникод). UCS содержит все символы других стандартов и кодировок. Его использование гарантирует полную взаимозаменяемость, то есть таблицы для конвертирования могут быть построены таким образом, что не произойдет потери информации при конвертировании строки из одной кодировки в UCS и обратно. UCS содержит символы, необходимые для представления практически всех известных сейчас языков. В него включены не только такие языки, как латинский, греческий, кириллица, иврит, арабский, армянский, грузинский, но также и японские, китайские и корейские идеограммы, а также такие языки, как бенгальский, тамильский, тайский, малайский, тибетский, хмерский, рунический, эфиопский, лаосский, чероки, монгольский, Gurmukhi, Gujarati, Hiragana, Katakana, Hangul, Devanagari, Oriya, Telugu, Kannada, Bopomofo, Canadian Syllabics, Ogham, Myanmar, Sinhala, Thaana, Yi и многие другие. Для неперечисленных выше языков постоянно ведутся работы для поиска их самой оптимальной кодировки для копьютеров. Это не только такие языки, как различные иероглифические языки и языки из индо-европейской исторической группы, но и некоторые искуственные языки, такие как Tengwar, Cirth, и Klingon. Также 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) добавляет символы в группу 0 извне BMP в некоторые дополнительные плоскости в диапазон от 0x10000 до 0x10ffff. Пока нет планов по добавлению символов за предел 0x10ffff в существующий стандарт, хотя в обозримом будущем во всем пространстве кода в действительности будет использоваться только малая часть группы 0. BMP содержит все символы, используемые в других наборах символов. Дополнительные плоскости, добаляемые ISO 10646-2 покрывают некоторые особенные, специальные и экзотические символы используемые в науке, печати словарей, издательской индустрии протоколах высокого уровня и некоторыми энузиастами.

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

Символы 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 и технические сообщения, публикуемые Unicode Consortium, обеспечивают много дополнительной информации и семантике и рекомендациях по использованию разных символов. Также поясняются руководящие принципы и алгоритмы для редактирования, сортировки, сравнения, нормализации, преобразований и выводе строк Unicode.

УНИКОД В LINUX
В системах GNU/Linux, типа C wchar_t ялвяется 32-битным целым типом со знаком. Его значения всегда интерпретируются библиотеками C как значения кодов UCS (во всех локалях), правилом, по которому библиотеки GNU C сигнализируют приложениям ою этом, является определение константы __STDC_ISO_10646__ по стандарту ISO C 99. UCS/Unicode может использоваться подобно ASCII в потоках ввода/вывода, терминальных соединениях, текстовых файлах, названиях файлов и в переменных окружения в многобайтовых кодировках UTF-8, совместимых с ASCII. Для обозначения использования UTF-8 как кодировки во всех приложениях должна быть выбрана применимая локаль через переменные окружения (например, "LANG=en_GB.UTF-8").

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

В Linux, в общем на текущий момент может использоваться только BMP на уровне реализации 1. Также поддерживается до двух комбинированных символов на основной символ для некоторых языков (в частности тайский) некоторыми эмуляторами терминала UTF-8 и шрифтами ISO 10646 (уровня 2), но в общем должны использоваться, где это возможно, предварительно созданные символы (Unicode называет это Нормализацией форм С).

ЗАКРЫТАЯ ОБЛАСТЬ
В BMP символы с 0xe000 до 0xf8ff никогда не будут использованы стандартными символами и зарезервированы для использования системой. В Linux эта область делится на две части: первая (с 0xe000 по 0xefff) может использоваться конечным пользователем, а вторая (так называемая зона Linux), начинающаяся с 0xf000 и заканчивающаяся 0xf8ff, которая может использоваться всеми пользователями Linux. Регистрацией символов этой части занимается H. Peter Anvin <Peter.Anvin@linux.org>.

ЛИТЕРАТУРА

*   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. Доступна в формате PDF-файла на CD-ROM или на 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. Хорошая книга о программировании на языке C. Четвертое издание включает в себя описание поправки, сделанной в стандарте ISO C 90 в 1994 году, (ISO/IEC 9899:1990). Эта поправка добавляет к стандарту большое количество новых библиотечных функций C для поддержки различных наборов символов, но пока еще не покрывает весь стандарт ISO C 99, который расширяет поддержку широких и многобайтовых символов.

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

*   Markus Kuhn: UTF-8 and Unicode FAQ for Unix/Linux.
    http://www.cl.cam.ac.uk/~mgk25/unicode.html Обеспечивает информацией о подписке на список рассылки о linux-utf8, являющийся наилучшим местом для поиска решений об использовании Unicode в Linux.

*   Bruno Haible: Unicode HOWTO.
    ftp://ftp.ilog.fr/pub/Users/haible/utf8/Unicode-HOWTO.html

НАЙДЕННЫЕ ОШИБКИ
В момент написания этой страницы поддержка библиотекой GNU C Library для локалей UTF-8 была уже сформирована, поддержка XFree86 была разработана до более хорошего уровня, но работа над созданием приложений (в большинстве своем - небольших редакторов), пригодных для использования в локалях UTF-8, шла еще полным ходом. Сейчас общая поддержка UCS под Linux обеспечивается для CJK символами двойном ширины и иногда даже простой перестройкой комбинированных символов, но все-же обычно не включает в себя поддержку для языков, использующих направление написания справа налево, или требования замены лигатур, то есть таких, как иврит, арабский и индийский языки. Эти языки сейчас поддерживаются только в некоторых GUI-приложениях (пограммы просмотра HTML, текстовые редакторы) с расширенными возможностями обработки символов.

АВТОРЫ
Markus Kuhn <mgk25@cl.cam.ac.uk>

СМ. ТАКЖЕ
utf-8(7), charsets(7), setlocale(3)