Опубликован: 24.07.2006 | Уровень: для всех | Доступ: свободно
Лекция 12:

Русификация и шрифты

Может возникнуть вопрос: а надо ли подробно разбирать вопрос русификации, не лучше ли просто сразу установить русифицированный дистрибутив? Тем более, что в последних версиях дистрибутивов Red Hat Cyrillic Edition, ASPLinux и AltLinux русификация выполнена на вполне приемлемом уровне. Однако, даже в случае установки русифицированного дистрибутива вы имеете шанс столкнуться с проблемой русификации на последующих этапах. Может получиться так, что новая версия нерусифицированного дистрибутива появится раньше, чем соответствующий русифицированный вариант, и вы захотите его установить. Не всегда хочется дожидаться пока выйдет русская версия. Русификация может нарушиться при обновлении отдельных программных пакетов. У меня, например, что-то случилось с русификацией после установки XFree86 версии 4.0.1. Таким образом, задача русификации может встать перед любым пользователем ОС Linux.

Когда я начинал работать с ОС Linux, самым лучшим материалом по русификации был "The Linux Cyrillic HOWTO" Александра Беликова (Версия 4.2 b2, Декабрь 11, 1998) в переводе Е.М. Балдина. Кроме этого HOWTO были доступны только материалы со странички Леонида Кантера. Однако оба этих источника уже в то время существенно устарели, так как в Red Hat версии 6 изменились даже команды выбора шрифта. Переводчик "The Linux Cyrillic HOWTO" Е. Балдин в настоящее время создает свой вариант HOWTO по кириллизации http://www.inp.nsk.su/~baldin. Думаю, что в ближайшее время (когда автор закончит работу над ним) он станет исчерпывающим источником сведений по этому вопросу1К сожалению, это мое предсказание не сбылось - Е.Балдин так и не закончил работу над Ciryllic HOWTO. Правда, с одной стороны вопрос оказался сложнее, чем первоначально казалось, из-за непоследовательности в развитии ПО, а с другой стороны, актуальность вопроса снизилась в силу того, что появились хорошо русифицированные дистрибутивы, а также потому, что Линукс начал движение в сторону UNICODE.. Очень полезен также RU.LINUX.FAQ. Настоящая лекция во многом следует этим двум основным источникам..

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

В разных дистрибутивах применяются или один, или другой. Например, в Red Hat 4.х и 5.x для русификации консоли применялся пакет kbd. В Red Hat 6.x применяется уже другой пакет - consoletools. Приводимое ниже описание ориентировано, в основном, на пакет consoletools.

Предварительные сведения

В "лекции 9" мы уже рассмотрели вопрос о кодировке символов и о работе клавиатуры, а также научились задавать (изменять) раскладку клавиатуры, т. е. вопрос о вводе информации в компьютер. Теперь надо рассмотреть вторую сторону этого вопроса - вопрос о выводе информации для восприятия человеком.

Вывод символов на экран

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

Текстовый режим

Работа экранного драйвера текстового режима основана на использовании 16 битовой кодировки символов UNICODE (UCS2). Изображение каждого символа, соответствующего любому двухбайтовому коду кодировки UNICODE, представляется матрицей из нолей и единиц размером 8 столбцов на H строк (обычно H принимает значения 8, 14 или 16). Единица в этой матрице соответствует светящейся точке на экране, а ноль - затемненной точке. Каждая строка этой матрицы кодируется одним байтом. Совокупность таких матриц (точнее, их байтовых представлений) для всех символов UNICODE образует таблицу экранного шрифта (Screen Font Map - SFM). Файл, в котором хранится такая таблица, может содержать шрифт одного размера по высоте (H) или шрифты нескольких размеров.

Сам экранный драйвер может работать в одном из двух режимов: режиме UTF или байтовом режиме. Выбор режима определяется приложением, которое обращается к этому драйверу для вывода символов на экран.

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

В байтовом режиме драйвер экрана использует дополнительную таблицу - таблицу перекодировки символов (Application Charset Map или кратко ACM) для преобразования получаемых от приложения последовательностей байтов в коды UNICODE. Эта таблица зависит от кодировки символов, применяемой приложением. В дальнейшем драйвер экрана, как и в режиме UTF, обращается к таблице экранного шрифта (SFM) для того, чтобы извлечь из нее изображение нужного символа.

Примечание:

Для того, чтобы определить, работает ли виртуальная консоль в режиме UTF или в байтовом режиме, можно воспользоваться скриптом vt-is-UTF8, а для переключения режимов работы виртуальной консоли служат два скрипта: unicode_start и unicode_stop.

В ядре Linux отведено место для хранения четырех таблиц перекодировки ACM. Первые три таблицы определяют 437 кодовую страницу IBM (cp437), таблицу для набора символов терминала DEC VT100 (vt100) и таблицу для набора символов ISO latin1 (iso01). Эти три таблицы встроены в ядро и никогда не меняются. В качестве четвертой таблицы перекодировки в ядре может быть записана таблица перекодировки, выбранная пользователем.

Консольный драйвер Linux позволяет для каждой виртуальной консоли определить (с помощью команды charset ) две ссылки (в документации их называют "сокетами") на таблицы перекодировки ACM. Эти две ссылки обозначаются как G0 и G1, причем для каждого виртуального терминала значения, присвоенные этим ссылкам, выбираются независимо. Однако, хотя ссылки G0 и G1 задаются независимо для каждого виртуального терминала, выбор таблицы перекодировки, определяемой каждой ссылкой, можно производить только из четырех таблиц, записанных в ядре. Поэтому реально все терминалы используют одну и ту же пользовательскую таблицу ACM. То есть, вы можете задать для tty1 использование G0=cp437 и G1=vt100, а для tty2 использование G0=iso01 и G1=user1 (определяемая пользователем кодировка), но не можете сделать так, что в одно и то же время tty1 использует таблицу user1, а tty2 использует таблицу user2.

Команда consolechars используется для изменения ACM, так же как и для задания шрифта и ассоциированной с ним таблицы SFM. С помощью команды consolechars можно считать консольный шрифт (таблицу экранного шрифта SFM) 8xH из файла и загрузить его в память, а также сохранить в файле шрифт, загруженный в память. Эта же команда служит для загрузки в ядро таблицы перекодировки, а также позволяет переопределить ссылки G0 и G1.

В качестве одной из опций команды consolechars при загрузке экранного шрифта из файла может быть задан размер шрифта по вертикали H. Значение H должно считываться из файла шрифта. Однако файлы некоторых форматов (в частности, файлы, содержащие только битовые образы символов) не содержат прямого указания на этот размер. В таком случае значение опции -H вычисляется исходя из размера файла (обычно -H 8, -H 14 или -H 16 ). Поскольку в настоящее время Linux не позволяет программно переключать режим работы дисплея, то выбор подходящего значения H в зависимости от установленного разрешения экрана полностью возлагается на пользователя.

В заключение отметим еще, что файлы с экранными шрифтами по умолчанию располагаются в каталоге /usr/lib/kbd/consolefonts/, а каталог /usr/lib/kbd/consoletrans/ используется для хранения как таблиц ACM, так и SFM.

Графический режим

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

Владислав Гермак
Владислав Гермак

Приглашения оболочки

Одна из очень важных переменных имеет имя PS1. Эта переменная задает вид приглашения, которое bash выводит, когда ожидает ввода очередной команды пользователем. По умолчанию этой переменной присвоено значение "\s-\v\$ ".

"\s-\v\$ ". -значиние /v замените /u

Сергей Пархоменко
Сергей Пархоменко
Россия, Ростов-на-Дону, ЮФУ (ДГТУ), 2008