CHARSETS(7)

НАЗВАНИЕ
charsets - наборы символов для разных языков

ОПИСАНИЕ
Linux - это интернациональная операционная система. Различные ее утилиты и драйверы устройств (включая драйвер консоли) поддерживают многоязыковые наборы символов, включая символы латинского алфавита с диакритическими знаками, знаками ударения, лигатурами и нелатинские алфавиты, включая греческий, арабский, кириллицу и иврит.

Эта страница предоставляет Вам информацию о различных стандартах наборов символов: ASCII, ISO 8859, KOI8-R, Unicode, ISO 2022 и ISO 4873, и их совмещение в Linux с позиции программиста. Основной упор делается на наборы символов, используемые в локалях (а не на огромное количество наборов существующих в других системах).

Существует список наборов символов, которые поддерживаются в glibc 2.2.3 is: ISO-8859-{1,2,3,5,6,7,8,9,13,15}, CP1251, UTF-8, EUC-{KR,JP,TW}, KOI8-{R,U}, GB2312, GB18030, GBK, BIG5, BIG5-HKSCS и TIS-620. (Румынский приравнивается к ISO-8859-16.)

ASCII
ASCII (American Standard Code For Information Interchange - американский стандартный код для обмена информацией) использует оригинальный 7-битный набор символов, изначально разработанный для американского варианта английского языка. Этот код описан в стантдарте ECMA-6.

Существуют различные варианты ASCII, в которых американский символ доллара (и знаки пунктуации) заменяются на знаки валют (из 7 бит) различных стран (Германия, Великобритания, Испания и др.). Все эти наборы символов не поддерживаются GNU libc, так как не подъодят под стандарт наборов символов ASCII. (Эти наборы известны как ISO-646)

Так как ОС Linux была создана для оборудования, разработанного в США, то она с самого начала поддерживает ASCII.

ISO 8859
ISO 8859 - это последовательность из 15-и 8-битных наборов символов, каждый из которых имеет в своей нижней (7-битной) половине, невидимые управляющие символы US ASCII в позициях от 128-и до 159-и и 96 графических символов фиксированной ширины в позициях 160-255.

Из них самой важной является последовательность ISO 8859-1 (Latin-1). Она поддерживается драйвером консоли Linux, X11R6 и является базовым набором символов HTML.

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

Hиже приводится краткое описание каждого набора.

8859-1 (Latin-1)
    Latin-1 описывает большинство западноевропейских языков, таких, как: албанский, каталонский, датский, голландский, английский, фарезский, финский, французский, немецкий, галицийский, ирландский, исландский, итальянский, норвежский, португальский, испанский и шведский. Отсутствие лигатуры ij голландского языка, oe французского языка и старых ,,немецких`` кавычек вполне приемлемо.

8859-2 (Latin-2)
    Latin-2 подерживает большинство славянских и центральноевропейских языков: хорватский, чешский, немецкий, венгерский, польский, румынский, словацкий и словенский.

8859-3 (Latin-3)
    Latin-3 включает в себя набор символов эсперанто, галицийского и мальтийского языков. (турецкий сейчас пишется как 8859-9.)

8859-4 (Latin-4)
    Latin-4 включает в себя символы эстонского, латвийского и литовского языков. В целом, он устарел; см. 8859-10 (Latin-6) и 8859-13 (Latin-7).

8859-5
    Кириллические символы поддерживают болгарский, белорусский, македонский, русский, сербский и украинский языки. Украинцы читают букву "г" с направленной вниз чертой как "х", поэтому для правильного написания "г" вам понадобится буква "г" с чертой, направленной вверх. (См. ниже описание KOI8-R).

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

8859-7
    Поддерживает современный греческий язык.

8859-8
    Поддерживает современный иврит без niqud (знаки пунктуации). Niqud и полный библейский иврит не входят в этот набор. Под Linux предпочтительно использовать для этого кодировку UTF-8.

8859-9 (Latin-5)
    Это вариант Latin-1, в котором исландские буквы заменены турецкими.

8859-10 (Latin-6)
    Latin 6 добавляет последние инуитские (гренландские) буквы и буквы сами (Sami Lappish), отсутствующие в Latin 4, для того, чтобы объединить шрифты всех нордических языков. RFC 1345 описывает начальный и отличный от него "latin6". В описание сами (sami) не вошло описание нескольких ударений.

8859-11
    Эта кодировка является черновиком стандарта. Черновик идентичен кодировке TIS-620, используемую для тайского под Linux.

8859-12
    Этот набор не существует. он был зарезервирован под вьетнамский, но он не подходит под 96 знаков. Для вьетнамского под Linux используется UTF-8.

8859-13 (Latin-7)
    Поддерживает балтийские языки, в частности, латвийские символы не вошедшие в Latin-4.

8859-14 (Latin-8)
    Это кельтский набор символов для гэлльского и уэльского языков. Этот набор также содержит символы для старого ирландского.

8859-15
    Добавлен европейский знак и французские и финские лигатуры, отсутствующие в Latin-1.

8859-16 (Latin-10)
    Этот набор включает в себя почти все языки из 8859-2, и поддерживает полный румынский.

KOI8-R
KOI8-R является не-ISO набором символов, популярным в России. Hижняя часть таблицы описывает US ASCII, верхняя - набор символов кириллицы, более совершенный по сравнению с ISO 8859-5. KOI8-U это общий набор основанный на KOI8-R, имеющий полную поддержку украинского. Ни один из этих наборов не совмещается с ISO-2022 (в отличии от ISO-8859).

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

JIS X 0208
JIS X 0208 является стандартным набором для японского языка. Существуют несколько других стандартов, например, JIS X 0201, JIS X 0212 и JIS X 0213, но первый, самый распространенный. Символы берутся из массива 94x94 и представлены двумя байтами каждый из которых находится в интервале 0x21-0x7e. Заметьте, что JIS X 0208 является набором символов, а не кодировкой. Это означает, что JIS X 0208 не может представлять текстовую информацию самостоятельно, а является лишь компонентом для кодировок, таких как EUC-JP, Shift_JIS и ISO-2022-JP. EUC-JP является наиболее употребимой для Linux и включает в себя US ASCII и JIS X 0208.

KS X 1001
KS X 1001 это корейский национальный стандарт для наборов символов. Как и в JIS X 0208, символы берутся из матрицы 94x94 и состоят из двух байт. KS X 1001, так же как и JIS X 0208, является компонентом для кодировок EUC-KR, Johab и ISO-2022-KR. EUC-KR является наиболее употребимой кодировкой для Linux и включает в себя US ASCII и KS X 1001. KS C 5601 это старое название KS X 1001.

GB 2312
GB 2312 это стандартный набр символов для упрощенного китайского. Как и в JIS X 0208, символы берутся из массива 94x94 и состоят из двух байт. Набор символов используется для кодировки EUC-CN. EUC-CN является наиболее используемой кодировкой для Linux и включает в себя US ASCII и GB 2312. EUC-CN часто называют GB, GB 2312 или CN-GB.

Big5
Big5 это популярный в Тайване набор для отображения традиционного китайского. Big5 является и кодировкой и набором символов. Он в ключает в себя US ASCII. Символы не входящие в ASCII представлены двумя байтами. Первый байт (символ представлен двумя байтами) берется из диапазона 0xa1-0xfe. Big5 несовместим с ISO 2022.

TIS 620
TIS 620 это набор тайских символов с US ASCII. Как и в стандарте ISO 8859, байты тайских символов находятся в интервале 0xa1-0xfe. TIS 620 наиболее используемый набор для Linux.

УНИКОД
Unicode (ISO 10646) является стандартом, который может воспроизвести любой символ из всех известных человеку языков. Unicode изначально является 32-битным, так же есть 16-ти битный (UTF-16) и 8-ми битный (UTF-8). Информацию о Unicode можно найти по адресу: <http://www.unicode.org>.

Для представления Unicode в Linux используется 8-битный формат преобразования Unicode (UTF-8 - 8-bit Unicode Transformation Format). UTF-8 - это формат непостоянной длины для кодирования Unicode. Он использует 1 байт для кодирования 7-и битов, 2 байта для 11-и битов, 3 байта для 16-и битов, 4 байта для 21-ого бита, 5 байтов для 26-и битов, 6 байтов для 31-ого бита.

Пусть 0, 1, x соответствует нулю, единице и случайному биту. Байт 0xxxxxxx соответствует Unicode 00000000 0xxxxxxx, что, в свою очередь, соответствует символу US ASCII 0xxxxxxxx. Таким образом, ни код, ни размеры файлов ASCII в UTF-8 не изменяются.

Байт 110xxxxx является началом 2-байтного кода, и 110xxxxx 10yyyyyy преобразуется в 00000xxx xxyyyyyy. Байт 1110xxxx - начало 3-байтного кода, и 1110xxxx 10yyyyyy 10zzzzzz преобразуется в xxxxyyyy yyzzzzzz. (Если UTF-8 используется для кодирования 31-битного ISO 10646, то это прогрессия продолжается до 6-байтных кодов.)

Большинство людей используют наборы ISO-8859, это означает, что символы не входящие в ASCII кодируются двумя байтами. Это приводит к тому, что обычный текстовый файл будет больше на 1-2 процента. Для текстов на греческом или русском на 100%, так как почти все символы в этих языках за пределами ASCII. Для японского 16-ти битный символ будет представлен 3-мя байтами.

Обратите внимание, что UTF-8 является самосинхронизирующимся: 10xxxxxx - это "хвост", а любой другой байт - "голова" кода. Заметьте также, что байты ASCII в потоке UTF-8 встречаются без изменений. В частности, в потоке нет встроенных символов NUL или "/", формирующих код.

Так как символы ASCII, в частности, NUL и "/", не изменяются, то ядро не замечает, что используется UTF-8. Неважно, какие байты обрабатывает ядро.

Визуализация потоков данных Unicode обычно производится с помощью таблицы "подшрифтов", переводящей единицы набора Unicode в глифы. Ядро использует Unicode для описания подшрифта, загруженного в видеопамять. Это означает, что в режиме UTF-8 можно использовать набор символов с 512-ю различными символами. Этого недостаточно для японского, китайского и корейского языков, но достаточно для большинства других.

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

ISO 2022 И ISO 4873
Стандарты ISO 2022 и 4873 описывают модель управления шрифтами, основанную на практике работы VT100. Эта модель (частично) поддерживается ядром Linux и xterm(1). Она популярна в Японии и Корее.

Имеется 4 набора графических символов, называемых G0, G1, G2 и G3. Один из них является текущим набором символов для кодов со старшим битом, равным нулю (изначально G0), другой - текущим набором для кодов со старшим битом, равным единице (изначально G1). Каждый набор графических символов имеет 94 или 96 символов и, по существу, является 7-битным набором символов. Используются либо коды 040-0177 (041-0176), либо 0240-0377 (0241-0376). Размер G0 всегда равен 94-м символам и содержит коды 041-0176.

Переключение с одного набора символов на другой производится с помощью функций сдвига ^N (SO or LS1), ^O (SI or LS0), ESC n (LS2), ESC o (LS3), ESC N (SS2), ESC O (SS3), ESC ~ (LS1R), ESC } (LS2R), ESC | (LS3R). Функция LSn делает набор символов Gn текущим для кодов со старшим битом, равным нулю. Функция LSnR делает набор символов Gn текущим для кодов со старшим битом, равным единице. Функция SSn делает набор символов Gn (n=2 или 3) текущим только для следующего символа (независимо от значения старшего бита).

94-символьный набор становится набором символов Gn c помощью последовательности ESC ( xx (для G0), ESC ) xx (для G1), ESC * xx (для G2), ESC + xx (для G3), где xx является символом или парой символов, которая содержится в ISO 2375 International Register of Coded Character Sets (международном реестре кодированных наборов символов). Hапример, ESC ( @ выбирает в качестве G0 набор символов ISO 646, ESC ( A выбирает стандартный набор символов UK (со знаком фунта вместо знака номера), ESC ( B выбирает ASCII (со знаком доллара вместо знака валюты), ESC ( M выбирает набор символов для африканских языков, ESC ( ! A выбирает кубинский набор символов и т.д. и т.п.

96-символьный набор назначается набором символов Gn с помощью последовательности ESC - xx (для G1), ESC . xx (для G2) или ESC / xx (для G3). Hапример, ESC - G выбирает в качестве G1 иврит.

Мультибайтный набор символов назначается набором символов Gn последовательностью ESC $ xx или ESC $ ( xx (для G0), ESC $ ) xx (для G1), ESC $ * xx (для G2), ESC $ + xx (для G3). Hапример, ESC $ ( C выбирает для G0 корейский набор символов. Существует более новая версия японского набора символов, выбираемых при помощи ESC $ B и при помощи ESC & @ ESC $ B.

ISO 4873 оговаривает более направленное использование наборов символов, при котором G0 фиксирован (всегда ASCII), так что G1, G2 и G3 могут быть заданы только для кодов с установленным старшим битом. При этом ^N и ^O больше не используются, ESC ( xx может быть использована только с xx=B, а ESC ) xx, ESC * xx и ESC + xx эквивалентны ESC - xx, ESC . xx и ESC / xx соответственно.

СМ. ТАКЖЕ
console(4), console_ioctl(4), console_codes(4), ascii(7), iso_8859_1(7), unicode(7), utf-8(7)