Вперед Назад Содержание

## 3. Кириллизация текстового режима

Кириллизация текстового режима -- самый простой способ отображать и вводить символы кириллицы.

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

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

## 3.1 Консольный драйвер Linux

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

Чтобы настроить консоль, вы можете воспользоваться одним из двух описанных ниже пакетов: console-tools (См. раздел consoletools) или kbd (См. раздел kbd).

В ранних версиях Linux альтернативы kbd не было, но в свежих дистрибутивах вместо kbd сейчас можно использовать пакет consoletools. Этот пакет кардинально отличается от своего предшественника -- пакета kbd (например, в нем нет команды `setfont` -- для совместимости используется эмулирующий скрипт).

Чтобы проверить, какой из двух пакетов присутствует в вашей системе, следует попробовать выполнить команду `consolechars`. Если она успешно выполнилась -- тогда у вас есть пакет console-tools; если же нет -- у вас скорее всего имеется команда `setfont` и значит, установлен пакет kbd.

Вам будет полезно знать общую схему работы консольного драйвера. Когда некоторая пользовательская программа запрашивает консольный драйвер вывести на экран символ, имеющий код А, то консольный драйвер сначала ищет код А в таблице ACM (Application Charset Map). Из таблицы он узнает, какой код Б согласно кодировке Unicode соответствует коду А. Вы определяете используемую вами кодировку посредством таблицы ACM. Далее консольный драйвер ищет код Б в таблице SFM Screen Font Map. Таблица SFM определяет кодировку используемого шрифта подобно тому, как ACM определяет вашу кодировку. От SFM консольный драйвер узнает, какой символ активного шрифта имеет код Б согласно Unicode и нужно вывести на экран.

Существуют две важные модификации этой схемы.

Аппаратные ограничения современных компьютеров не позволяют использовать шрифты, имеющие более 512 символов. Отсюда очевидно, что иногда консольный драйвер не сможет найти код Б в SFM. Тогда ему на помощь приходит так называемая fallback таблица. Эта таблица определяет для кода Б возможные его аппроксимации Б1, Б2,... Например, если Б является код символа "левая двойная угловая кавычка", то возможно Б1 будет кодом символа "левая одинарная угловая кавычка", а Б2 будет просто кодом символа "<". Другим часто используемым применением fallback таблицы является аппроксимация псевдографических символов посредством других. Например, если используемый шрифт не имеет псевдографических символов, и вы заставите консольный драйвер использовать таблицу `graph.fallback`, то он начнёт чертить окна подобно следующей картинке:

    +==================.
    |   Главное меню   |
    +------------------+
    | 1. текст         |
    | 2. графика       |
    .==================.

На экране это выглядит не так уж и плохо.

Второй важной модификацией общей схемы работы консольного драйвера является режим Unicode. Описанная выше схема относится к 8ми битовому режиму работы драйвера. Когда же он находится в режиме Unicode, то он ожидает, что пользовательские программы используют Unicode и ожидает получать от них коды символов согласно Unicode. Поэтому в этом режиме ACM не используется. Вы всегда можете переключать консольный драйвер из 8ми битового режима в Unicode и обратно посредством команд `unicode_start` и `unicode_stop`.

Возможно, у вас появился следующий вопрос: а зачем нужна вся эта сложная процедура? Что, если я буду использовать шрифты, имеющие используемую мной кодировку? Это возможно, но возникают некоторые осложнения. Вам нужно сказать программам, что псевдографические символы в шрифте уже находятся на других местах. И даже если вы ухитритесь сделать это посредством специального терминального типа (как например `linux-koi8r`), то появится вторая (уже неразрешимая) проблема -- из-за аппаратных свойств VGA, горизонтальная псевдографика получится с разрывами, если символы псевдографики в шрифте не расположены на тех же позициях, что и в кодировке cp437 (расположение псевдографики в cp866 идентично cp437). Поэтому рекомендуется использовать шрифты, имеющие кодировку на основе cp437 (cp866).

Прежде чем приступить к делу, разберёмся с 8-битовым режимом. Не всегда консольный драйвер Linux умел работать с Unicode. Конечно, тогда не существовали также и ACM, и SFM. Вместо них использовалась 8-битовая экранная таблица перекодировки (screen map). Это была просто таблица для перевода от одной кодировки (используемой программой) в другую (кодировку шрифта). Например, `koi2alt.trans` переводит коды KOI8-R в коды cp866. Для совместимости теперь 8-битовый screen map эмулируется с помощью специальной таблицы ACM.

Установка кириллицы с помощью пакетов `console-tools` и `kbd` обычно состоит из:

1. Настройки экранного шрифта и SFM. Это делается с помощью программы `consolechars` (пакет `console-tools`) или `setfont` и `mapscrn` (пакет `kbd`).
2. Настройки ACM (или 8-битовой экранной таблицы перекодировки) и fallback-таблицы .
3. Загрузки соответствующей раскладки клавиатуры с помощью программы `loadkeys`.

Большинство дистрибутивов позволяет устанавливать кириллицу по умолчанию во время загрузки.

Файлы шрифтов обычно находятся в каталогах /usr/share/consolefonts или /usr/lib/kbd/consolefonts, таблицы ACM, SFM и fallback в /usr/share/consoletrans, клавиатурные раскладки в /usr/share/keymap/i386/qwerty.

Ниже описано, как установить русскую клавиатурную раскладку. Здесь не используется SFM и fallback таблиц, а вместо ACM используется 8-битовая экранная таблица перекодировки. Это делается в основном из-за того, что у имеющихся в `kbd` и `console-tools` шрифтов для cp866 нет таблиц SFM. Если вы хотите воспользоваться всеми возможностями консольного драйвера Linux и радоваться хорошим шрифтам, то используйте пакет console-tools-cyrillic Виктора Вагнера (См. раздел Cyrillic console tools).

## 3.2 consoletools

Сам пакет можно найти по адресу console-tools.

В том случае, если ваш дистрибутив использует пакет consoletools, вам необходимо выполнить следующие действия (естественно, эти команды не следует выполнять дословно):

    foo="/место/где/лежат/ваши/консольные/шрифты"
    loadkeys $foo/ru.map
    consolechars -v -f $foo/Cyr_a8x16 -m $foo/koi2alt

После выполнения этих команд и загрузки соответствующих файлов вы можете переключать раскладку клавиатуры для ввода кириллических символов с помощью правого Control (иногда переключение по умолчанию "вешается" на Alt или Caps Lock).

К сожалению, шрифты и клавиатурные раскладки, поставляемые вместе с этими пакетами, не позволяют воспользоваться всеми возможностями консольного драйвера. Поэтому я рекомендую вам использовать пакет console-tools-cyrillic Виктора Вагнера (См. раздел Cyrillic console tools).

## 3.3 Cyrillic console tools

Этот пакет содержит кириллические консольные шрифты и таблицы перекодировки для Linux, а также раскладки клавиатуры и прочие полезные вещи. Последнюю версию этого пакета можно обнаружить по адресу ftp://ftp.ice.ru/pub/fonts/linux/. Этот пакет активно развивается Виктором Вагнером ( vitus@ice.ru).

Для настройки следует первым делом следует прочитать файл `README`, который идёт в поставке. Для работы с пакетом необходимы утилиты consoletools (См. раздел consoletools), впрочем, экранные шрифты можно использовать и с последними kbd.

Все шрифты сделаны на базе альтернативной кодировки (CP866). Почему? Потому что использование любой другой кодировки русских букв в качестве физической в текстовом режиме VGA приводит к тому, что горизонтальная псевдографика получается с разрывами. Это аппаратное свойство VGA, которое никак не лечится. Единственный выход -- использовать шрифты, в которых псевдографика расположена на тех же позициях, что и в cp437.

В пакет входят семь комплектов шрифтов различной степени пригодности и функциональности. Все шрифты содержат в себе таблицу отображения в unicode.

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

В пакет включена комплект для генерации клавиатуры, основанный на идеях, предложенных Кириллом Злобиным ( slobin@ice.ru). Раскладки клавиатуры получаются с помощью обработки препроцессором C (`/usr/bin/cpp`) файла кодировки и собственно файла раскладки. Использование макросов для описаний клавиш позволяет существенно полнее чем в большинстве распространенных раскладок определить комбинации Alt-клавиша, Ctrl-клавиша и т.д., как в русском, так и в латинском режимах.

Для настройки консоли я использую команды:

    consolechars -f UniCyr_8x16.psf -m koi8-r.acm
    loadkeys console_russian.map

Для создания клавиатурной раскладки `console_russian.map` выполняю команду:

    cpp -DWINONLY -DBACKSPACE cyr-russian-ms.cpp > console_russian.map

Это microsoft раскладка, переключение осуществляется с помощью дополнительной клавиши Windows "клавиши системного меню".

P.S. Для украинизации вместо `koi8-r.acm` надо подставить koi8-u

## 3.4 kbd

Довольно много дистрибутивов Linux устанавливают kbd как обязательную часть системы. Сам пакет доступен по адресу kbd.

Пакет kbd содержит утилиты управления клавиатурой, кроме этого, с ним поставляется широкий выбор шрифтов и раскладок.

Установка кириллицы с помощью kbd обычно состоит из:

1. Загрузки соответствующей раскладки клавиатуры с помощью программы `loadkeys`. Практически в каждом дистрибутиве можно установить раскладку клавиатуры, которую система загружает по умолчанию во время загрузки, с помощью соответствующей программы настройки (например, для RedHat -- это `/usr/sbin/kbdconfig`). Вы также можете просто запустить `loadkeys` из вашего `~/.profile` или сделать это руками.
2. Настройки экранного шрифта. Это делается с помощью программы `setfont`. Файлы шрифтов находятся в `/usr/lib/kbd/consolefonts`. ВНИМАНИЕ: В старых версиях Linux запуск программы `setfont` под X-Window мог завесить систему. Сейчас в этом случае печатается сообщение об ошибке.

Если вы являетесь приверженцем программ, работающих в текстовом режиме и использующих достоинства псевдографики PC (таких как Midnight Commander), то вы можете предпочесть использовать шрифты с `CP866` кодировкой и консольной раскладкой (console character map). Это означает, что ваша консоль отображает CP866 шрифты, но все кириллические символы, соответствующие KOI8-R кодировки, соответственным образом отображаются в `CP866` и поэтому выглядят правильно. Преимущество этого метода заключается в том, что он позволяет использовать псевдографические символы кодировки `CP866`.

Ниже перечислены команды, которые позволяют достичь этого эффекта.

    loadkeys /usr/lib/kbd/keytables/ru.map
    setfont /usr/lib/kbd/consolefonts/Cyr_a8x16
    mapscrn /usr/lib/kbd/consoletrans/koi2alt
    # ниже идет магическая последовательность
    echo -ne "\033(K"

При русификации всех консолей при загрузке системы вместо строчки

    echo -ne "\033(K"

следует использовать строчку

    for i in 1 2 3 4 5 6 7; do echo -ne "\033(K" > /dev/tty$i; done

-- это русифицирует все терминалы.

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

## 3.5 Проверка правильности кириллизации консоли

Теперь вы, вероятно, хотите проверить правильность кириллизации консоли.

Соответствующим образом настройте bash (раздел bash) или tcsh (раздел tcsh) -- этот шаг необходим, перегрузите его, затем нажмите правую клавишу `Control`. Удостоверитесь, что вы можете правильно печатать по-русски. Клавиша '`q`' должна соответствовать "`й`", '`w`' соответствует "`ц`", и т.д (`qwerty->йцукен`).

По той причине, что на данный момент существует множество самых разных дистрибутивов Linux, клавиша переключения в консоли может быть другой. Обычно это правый `Alt` или `Caps Lock` -- это зависит от раскладки клавиатуры.

Если у вас возникли непредвиденные проблемы, то лучше всего вернуться к родной (то есть US) раскладке. Для этого выполните следующие действия:

    loadkeys /usr/lib/kbd/keytables/defkeymap.map
    setfont /usr/lib/kbd/consolefonts/default8x16

ВНИМАНИЕ: В старых версиях Linux консольный драйвер не способен сохранить это состояние, когда передаётся управление X-Window. Следовательно, после того, как вы вышли из X (или переключаетесь на консоль), вы должны перезагрузить русский шрифт.

## 3.6 Что делать, если "слетела" консоль?

Скорее всего, на консоль был скопирован какой-то двоичный файл, где случайно встретилась переключающая ESC-последовательность. Тогда:

Сброс терминала:

    $ echo -ne "\033c"

набрать вслепую, или с работающей консоли:

    # echo -ne "\033c" >/dev/ttyX

Переключение на downloaded font

    $ echo -ne "\033(K"

(возможно, ещё придётся перегрузить шрифты, но это смотря как консоль сорвало...)

Если вывалилась какая-то программа, которая использует curses, то проще

    $ stty sane

В RedHat все это делают `reset; setsysfont <ctrl-j>`

`reset` -- из `ncurses`

См. 'man console_codes' и 'man stty'

Вперед Назад Содержание