Emacs для начинающих

Азбука кириллизации


Рассмотрим схематически процесс вывода на экран некоторого символа "x":

  • Прикладная программа, желая вывести "x" на экран, записывает в стандартный поток вывода соответствующую ему последовательность байт, которая в конечном счете достигает драйвера консоли (часть ядра Linux). Если драйвер консоли в этот момент находится в режиме UTF, он предполагает, что входные данные были записаны именно в этой кодировке, и использует стандартный алгоритм для преобразования UTF в Unicode (внутренняя кодировка ядра). В противном случае (т.н. "однобайтовый" или "ASCII" режим) драйвер использует таблицу перекодировки символов (Application Character Map, ACM) для перевода входного потока в Unicode. В ядре Linux отведено место для четырех таблиц ACM: cp437, vt100, iso01 и user-defined. Последнюю из них как раз и можно использовать для вывода однобайтовых кириллических кодировок (например, KOI8-R). Выбор пользовательской кодировки осуществляется ESC-последовательностью "(как правило, она генерируется автоматически соответствующими утилитами, хотя есть нюансы - см. bug #76470 в RedHat Bugzilla).
  • Теперь, когда драйверу консоли известен Unicode-код "x", он должен определить, какой глиф в текущем шрифте ему соответствует. Для этого используется таблица экранного шрифта (Screen Font Map, SFM). Для большинства современных шрифтов таблица SFM хранится в том же файле, что и глифы (признаком этого является расширение .psfu у файла шрифта).
  • После определения номера глифа, ядро дает команду видеоподсистеме. Знакогенератор, используя загруженный в него шрифт, воссоздает на экране изображение "x"

Для кириллизации консоли в Linux используются два конкурирующих пакета: и consoletools. Последний применялся в Red Hat версий 6.x-7.x, в более ранних и более поздних используется kbd. Оба пакета имеют сходную функциональность. Все необходимые для работы этих пакетов файлы хранятся в директории /lib/kbd: /lib/kbd/consolefonts (файлы шрифтов), /lib/kbd/consoletrans (ACM), /lib/kbd/unimaps (SFM) и /lib/kbd/keymaps (клавиатурные раскладки).

В дальнейшем по понятным причинам будем предполагать, что используется пакет kbd. Утилита setfont из этого пакета позволяет как загружать шрифты, так и устанавливать таблицы перекодировки ACM (параметр командной строки -m) и SFM (-u). Параметры можно комбинировать. Так, например, команда setfont Cyr_a8x16 -m koi2alt устанавливает шрифт Cyr_a8x16 и ACM-таблицу koi2alt.

Рассмотрим теперь, как организован процесс русификации в Red Hat 8.0. В первую очередь обратимся к файлу /etc/sysconfig/i18n. В нем определяются значения следующих переменных:

  • SYSFONT - имя шрифта. Расширение указывать необязательно.
  • SYSFONTACM - имя ACM-таблицы.
  • UNIMAP - имя SFM-таблицы.
  • LANG - определяет локаль (locale). Если название локали заканчивается на "UTF-8" (например, "ru_RU.UTF-8"), драйвер консоли переводится в режим UTF. Список установленных в системе локалей возвращается командой locale -a.
  • В процессе инициализации системы сценарий rc.sysinit выполняет /etc/sysconfig/i18n, после чего происходит запуск скрипта /sbin/setsysfont, загружающего шрифт и указанные таблицы перекодировки. Одновременно устанавливается клавиатурная раскладка, имя которой хранится в файле /etc/sysconfig/keyboard(переменная KEYTABLE).

    Теперь, когда мы представляем себе общую схему русификации консоли, рассмотрим два конкретных способа научить Red Hat говорить по-русски.



    Содержание раздела