Linux для пользователя - Виктор Костромин
Шрифт:
Интервал:
Закладка:
Соответствие между символами кода ASCII и образами (или изображениями символов) из файла шрифта можно изменить, используя таблицу перекодировки (ACM - Application Charset Map). Если эту таблицу не загрузить, то, например, в программе Midnight Commander вы можете вместо красивых рамочек увидеть столбцы и строки из непонятных символов. Некоторые файлы шрифтов включают таблицу перекодировки шрифта, и тогда consolechars загрузит эту таблицу. По умолчанию файлы шрифтов находятся в каталоге /usr/lib/kbd/consolefonts, а таблицы перекодировки - в каталоге /usr/lib/kbd/consoletrans.
Таблицу перекодировки в 6-ой версии Red Hat (т. е. в пакете consoletools) можно загрузить отдельной командой consolechars с опцией -m file:
[root]# consolechars -m /usr/lib/kbd/consoletrans/koi2alt
Если таблица перекодировки не включена в файл шрифта и не указана в опции -m, то используется "тривиальная" таблица.
В версии 5.2 для загрузки таблицы перекодировки используется команда mapscrn:
[root]# mapscrn /usr/lib/kbd/consoletrans/koi2alt.
В этом случае драйвер консоли должен быть дополнительно переведен в режим перекодировки, задаваемый таблицей, путем вывода на консоль специальной escape-последовательности. Эта последовательность есть ‹esc›(K для набора символов G0 (G0 character set) и ‹esc›)K для набора символов G1 (G1 character set). Заметим, что активизировать эту таблицу необходимо в каждой консоли. При этом команда loadkeys действует одновременно во всех виртуальных консолях, а вот команда mapscrn действует только в той виртуальной консоли, в которой выполнена команда echo -ne ' 33(K'.
Замечание:
Esc(K требуется, когда загружается альтернативная кодировка и активизируется таблица перекодировки псевдографики командой mapscrn koi2alt. Если шрифт koi-8, то никаких Esc(K не надо.
Замечание:
Все это не действует из-под Midnight Commander!
Существует еще таблица перекодировки для символов UNICODE. Некоторые файлы шрифтов включают эту таблицу, и она будет загружена командой consolechars, если только не задана опция -force-no-sfm. Отдельно загрузить таблицу перекодировки символов Unicode можно командой consolechars с опцией -u (см. руководство man).
Итак, для того, чтобы русифицировать консоль, нужно выполнить следующую последовательность команд:
• - для версии 5.2 Red Hat:
loadkeys /usr/lib/kbd/keytables/i386/qwerty/ru.map
setfont /usr/lib/kbd/consolefonts/Cyr_a8x16
mapscrn /usr/lib/kbd/consoletrans/koi2alt
echo -ne ' 33(K'
• - для версии 6.0 Red Hat (и последующих):
loadkeys /usr/lib/kbd/keytables/i386/qwerty/ru.map
consolechars -f /usr/lib/kbd/consolefonts/Cyr_a8x16
consolechars -m /usr/lib/kbd/consoletrans/koi2alt
Но выполнять эту последовательность команд после каждого перезапуска компьютера, да еще в каждой виртуальной консоли, слишком обременительно. Поэтому рассмотрим вкратце, как русификация выполняется в дистрибутиве Black Cat Linux.
11.3.2 Как это сделано в дистрибутиве Black Cat
Во-первых, в файле /etc/sysconfig/i18n вводится новая переменная: в версии 5.2 это переменная SCRNMAP, а в версии 6.02 - SYSFONTACM. Этой переменной по умолчанию присваивается значение "koi2alt". Вот стандартный файл i18n из Black Cat Linux версии 6.02:
LANG=ru
LINGUAS=ru
LC_ALL=ru_RU.KOI8-R
SYSFONT=RUSCII_8x16
SYSFONTACM=koi2alt
Вызов файла i18n для задания значений переменных осуществляется из скрипта /sbin/setsysfont, из которого вызываются также команды setfont и mapscrn (в версии 5.2) или consolechars (в версии 6.0). Вот этот скрипт из Black Cat Linux версии 5.2:
-----------------------------------
#!/bin/sh
if [ -f /etc/sysconfig/i18n ]; then
. /etc/sysconfig/i18n
fi
if [ -x /usr/bin/setfont ]; then
if [ -n "$SYSFONT" ]; then
/usr/bin/setfont $SYSFONT
fi
if [ -x /usr/bin/mapscrn ]; then
if [ -n "$SCRNMAP" ]; then
/usr/bin/mapscrn $SCRNMAP
fi
fi
else
echo "can't set font"
exit 1
fi
------------------------------------
Как видно, при вызова скрипта /sbin/setsysfont выполняются команды "setfont Cyr_a8x16" и "mapscrn koi2alt". После этого, для включения в ядре кодовой таблицы пользователя, необходимо выдать на каждую виртуальную консоль последовательность " 33(K". Это реализовано путем добавления этой последовательности к файлу /etc/issue, который генерируется при загрузке системы скриптом /etc/rc.d/rc.local и вызывается на исполнение при логировании каждого пользователя. Вот пример скрипта /etc/rc.d/rc.local из версии 5.2:
-------------------------------------
#!/bin/sh
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
if [ -f /etc/blackcat-release ]; then
R=$(cat /etc/blackcat-release)
elif [ -f /etc/redhat-release ]; then
R=$(cat /etc/redhat-release)
else
R="release 3.0.3"
fi
arch=$(uname -m)
a="a"
case "_$arch" in
_a*) a="an";;
_i*) a="an";;
esac
# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
. /etc/sysconfig/i18n
echo "" > /etc/issue.net
echo "Black Cat Linux $R" >> /etc/issue.net
echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue.net
if [ -n "$SCRNMAP" ]; then
echo -ne " 33(K" > /etc/issue
else
echo "" > /etc/issue
fi
if [ -f /usr/bin/linux_logo ]; then
/usr/bin/linux_logo -n -o 2 >> /etc/issue
echo "" >> /etc/issue
fi
cat /etc/issue.net >> /etc/issue
echo "" >> /etc/issue
-------------------------------------
В версии 6.02 все происходит примерно так же. Просмотрите упомянутые выше файлы, и вы убедитесь в этом сами.
11.3.3. Переключение кодировок
Теперь поговорим о том, как "на лету" изменить кодировку символов. Необходимость в этом возникает в тех случаях, когда просматриваешь какой-то файл и вместо читаемого текста видишь непонятную абракадабру. В таких случаях хочется превратить ее в нормальный текст нажатием пары горячих клавиш. Можно, конечно, для каждого из необходимых шрифтов создать специальную команду, записав в небольшой файл приведенные выше команды, естественно соответствующим образом модифицированные. Однако ясно, что это не совсем удобно. В этом отношении хочется работать так же комфортно, как в программе FAR Е. Рошаля, где в том случае, когда просматриваешь файл по клавише ‹F3› или редактируешь его по ‹F4›, достаточно набрать ‹Shift›+‹F8› и получаешь возможность перекодировать выводимый на экран текст в любую из нескольких кодировок. Можно считать, что это уже роскошь, но что поделаешь, все мы быстро привыкаем к хорошему, и отказываться уже трудно.
2 июля 2000 г на сайте linux.ru.net появилась сообщение о заплате (патче) к Midnight Commander версии 4.5.50, которая позволяет производить перекодировку как в FAR, по нажатию клавиш ‹Ctrl›+‹T›. Тогда это можно было делать только во встроенной программе просмотра. На сегодня автор патча В. Студенников доработал его, так что перекодировка стала возможна и во встроенном редакторе (см. http://www.linux.zp.ua:8100/mc/ или http://www.sama.ru/~despaire/mc/my-patches.html).
Это что касается перекодировки «на лету». Как видите, такая перекодировка является функцией отдельных программ просмотра файлов. Если перекодировка «на лету» недоступна, то можно перекодировать сам текстовый файл. Для преобразования потока символов из одной кодовой страницы (charset) в другую, в стандарте POSIX существуют утилита iconv и функция iconv(). О других программах перекодировки мы поговорим в гл. 12.
11.4. Русификация X Window
Так же, как и в текстовом режиме, в графическом русификация определяется таблицей раскладки клавиатуры и файлами шрифтов. Впрочем, о том, как разобраться с клавиатурой, было достаточно сказано в разд. 9.3. Давайте теперь подробно рассмотрим, как организовать вывод на экран символов кириллицы.
11.4.1. Немного о терминологии
Для начала надо пояснить некоторые термины, часть из которых появилась еще в те времена, когда типографии называли словолитнями, а часть - уже в наше время, вместе с широким внедрением компьютеров в типографское дело. Некоторые из этих терминов получены прямым заимствованием из английского языка, например, фонт-сервер, рендеринг, глиф.
Пожалуй, важнейшим типографским термином является шрифт. В обычном, или «бытовом», если так можно выразиться, понимании шрифт - это только набор графических изображений символов, который служит для представления букв на бумаге или другой поверхности (например, экране, причем экране в широком смысле слова - экране кино, телевизора, компьютера). Поскольку можно сказать, что шрифты появились вместе с изобретением книгопечатания, история разработки и создания шрифтов исчисляется уже веками. За это время создание шрифтов превратилось в особый вид деятельности (может быть, даже в отрасль науки) со своей терминологией, инструментарием, традициями, школами и т.д. Новый импульс эта наука получила с переходом на компьютерные технологии.