Как использовать русскую, английскую и исландскую кодировку в консоли Linux.
Приспособление персонального компьютера для работы сразу с несколькими языками в некоторых случаях превращается в нетривиальную задачу. Операционные системы семейства UNIX и примыкающий к ним Linux не являются исключением. Надо сказать, что в современных дистрибутивах Линукса эта проблема решена для графической системы XFree/Xorg, где пользователь может указать различные кодировки и способ переключения между ними в главном конфигурационном файле XF86Config/Xorg.conf или же воспользоваться стандартными средствами KDE/GNOME. Но как быть, если хочется воспользоваться возможностями разных кодировок при работе в консоли?
Ответ на этот вопрос - может быть вопреки тому, что читатель ожидает от статьи с таким названием - никак! Увы, консоль в Линуксе настроена только на одну кодировку (+ английская). Но если вот приспичило работать в консоле и писать на нескольких языках (например, русском, английском и исландском), то ваше положение всё-таки не такое безнадёжное, как может показаться после такого вступления. Попробуем разобраться с этой проблемой в дистрибутиве Fedora Core 3.
Прежде всего убедимся, что наша консоль русифицирована. Для этого достаточно открыть файл /etc/sysconfig/keyboard и поменять строчку KEYTABLE="us" на KEYTABLE="ru". Также стоит заглянуть и в файл /etc/sysconfig/i18n, чтобы убедиться, что в нём стоит юникодовская версия языка, напр. LANG="us_US.UTF-8". Если это так, то больше ничего трогать не надо, вообще этот файл касается не столько кодировки, сколько локализации консоли, т.е. перевода служебных сообщений, формата даты и времени и тп. с английского соответственно на русский, исландский и тд. (Переключение между языками в консоли производится одновременным нажатием правых клавиш CTRL+SHIFT или же так: для переключения на 1 язык нажатием правой клавиши CTRL, а для обратного переключения - правой клавиши ALT GR или той же правой CTRL.) Вам необязательно менять язык локали на русский, принципиальна лишь юникодовская кодировка - я лично не люблю русифицированную локаль, т.к. она совершенно недоделана.
Пойдём дальше. Если мыслить логически, то можно установить, что фактически мы можем пользоваться двумя кодовыми страницами, если консоль настроена на русский язык - английской и русской, или на исландский - английской и исландской. На самом деле, это уже пол-дела - осталось только инкорпорировать третий язык! Разумеется, это легче будет сделать с исландским, который, как и английский, пользуется латинским алфавитом, но с добавлением 10 пар собственных букв - Þþ, Ðð, Ææ, Öö, Áá, Éé, Óó, Íí, Úú, Ýý. Именно эти символы нам надо как-то научиться печатать. (Очевидно, что в случае добавления русских букв к исландской кодировке нам пришлось бы добавить все 33 пары русских букв).
Как известно, консольный драйвер клавиатуры использует т.наз. keymaps, в которых указаны соответствия клавиш (или их комбинаций) определённым символам. Эти файлы лежат в папке /lib/kbd/keymaps/i386/qwerty/ (в других дистрибутивах эти файлы могут лежать в папке /usr/lib/kbd/...). За русский отвечает файл ru.map, который может быть заархивирован - ru.map.gz. Если мы его откроем, то можем увидеть такие записи:
altgr
keycode 23 = U+0448 # CYRILLIC SMALL LETTER SHA
altgr shift keycode 23 = U+0428 # CYRILLIC CAPITAL LETTER SHA
keycode 24 = +o
shift keycode 24 = +O
altgr keycode 24 = U+0449 # CYRILLIC SMALL LETTER SHCHA
altgr shift keycode 24 = U+0429 # CYRILLIC CAPITAL LETTER SHCHA
keycode 25 = +p
shift keycode 25 = +P
altgr keycode 25 = U+0437 # CYRILLIC SMALL LETTER ZE
altgr shift keycode 25 = U+0417 # CYRILLIC CAPITAL LETTER ZE
keycode 26 = bracketleft
shift keycode 26 = braceleft
alt keycode 26 = Meta_bracketleft
control keycode 26 = Escape
altgr keycode 26 = U+0445 # CYRILLIC SMALL LETTER HA
altgr shift keycode 26 = U+0425 # CYRILLIC CAPITAL LETTER HA
altgr alt keycode 26 = Meta_bracketleft
altgr control keycode 26 = Escape
keycode 27 = bracketright
shift keycode 27 = braceright
alt keycode 27 = Meta_bracketright
control keycode 27 = Control_bracketright
altgr keycode 27 = U+044A # CYRILLIC SMALL LETTER HARD SIGN
altgr shift keycode 27 = U+042A # CYRILLIC CAPITAL LETTER HARD SIGN
altgr alt keycode 27 = Meta_bracketright
altgr control keycode 27 = Control_bracketright
В первом столбце стоят дополнительные клавиши, используемые при нажатии вместе с основной. altgr означает вариант при переключении клавиатуры. Далее идёт код основной клавиши. После знака "=" указывается символ, который может быть выражен буквально (+p означает строчную латинскую букву 'p', +P - 'P', bracketleft - открывающую квадратную скобку и тд.) или по юникодовскому коду - если речь идёт о русских буквах, напр. U+0445 для русской строчной 'х' (подробнее см. коды на http://www.unicode.org/Public/UNIDATA/UnicodeData.txt). Итак, нам надо найти неиспользуемые комбинации клавиш и присвоить им столь нужные нам буквы исландского алфавита. Мы будем использовать их именованные обозначения, благо они известны:
þ/Þ - +thorn/+THORN;
ð/D - +eth/+ETH;
æ/Æ - +ae/+AE;
ö/Ö - +odiaeresis/+Odiaeresis;
á/Á - +aacute/+Aacute;
ó/Ó - +oacute/+Oacute;
ú/Ú - +uacute/+Uacute;
ý/Ý - +yacute/+Yacute;
í/Í - +iacute/+Iacute;
é/É - +eacute/+Eacute;
Нам осталось лишь найти, куда вставить эти коды букв. К сожалению, клавиши, которые используются для ряда этих букв в исландской раскладке, уже не имеют свободных мест. Более того, мне не получилось "научить" консоль воспринимать т.наз. "dead acute", когда буквы с акутом набираются при помощи нажатия клавиши акута и последующего нажатия клавиши соответствующей гласной (в результате чего эта гласная появляется со значком акута), т.е. á = ´ - a. Мы присвоим все гласные с акутом соответствующим гласным клавишам. Þ/þ мы присвоим клавише t, Ð,ð - d, а оставшиеся буквы пристроим без оглядки на фонетическое сходство: Ö/ö к q, а Æ/æ - к w. Разумеется, коды этих букв мы припишем латинской половине keymap'а. Кроме того, строчная буква будет выводиться при помощи дополнительной клавиши CTRL, а заглавная - ALT. В итоге мы внесём следующие изменения в файл ru.map:
keycode 16 = +q
shift keycode 16 = +Q
control keycode 16 = +odiaeresis
alt keycode 16 = +Odiaeresis
altgr keycode 16 = U+0439 #
CYRILLIC SMALL LETTER SHORT I
altgr shift keycode 16 = U+0419 # CYRILLIC CAPITAL LETTER SHORT I
keycode 17 = +w
shift keycode 17 = +W
control keycode 17 = +ae
alt keycode 17 = +AE
altgr keycode 17 = U+0446 #
CYRILLIC SMALL LETTER TSE
altgr shift keycode 17 = U+0426 # CYRILLIC CAPITAL LETTER TSE
keycode 18 = +e
shift keycode 18 = +E
control keycode 18 = +eacute
alt keycode 18 = +Eacute
<...>
keycode 20 = +t
shift keycode 20 = +T
control keycode 20 = +thorn
alt keycode 20 = +THORN
altgr keycode 20 = U+0435 #
CYRILLIC SMALL LETTER IE
altgr shift keycode 20 = U+0415 # CYRILLIC CAPITAL LETTER IE
keycode 21 = +y
shift keycode 21 = +Y
control keycode 21 = +yacute
alt keycode 21 = +Yacute
altgr keycode 21 = U+043D #
CYRILLIC SMALL LETTER EN
altgr shift keycode 21 = U+041D # CYRILLIC CAPITAL LETTER EN
keycode 22 = +u
shift keycode 22 = +U
control keycode 22 = +uacute
alt keycode 22 = +Uacute
altgr keycode 22 = U+0433 #
CYRILLIC SMALL LETTER GHE
altgr shift keycode 22 = U+0413 # CYRILLIC CAPITAL LETTER GHE
keycode 23 = +i
shift keycode 23 = +I
control keycode 23 = +iacute
alt keycode 23 = +Iacute
altgr keycode 23 = U+0448 #
CYRILLIC SMALL LETTER SHA
altgr shift keycode 23 = U+0428 # CYRILLIC CAPITAL LETTER SHA
<...>
keycode 24 = +o
shift keycode 24 = +O
control keycode 24 = +oacute
alt keycode 24 = +Oacute
keycode 30 = +a
shift keycode 30 = +A
control keycode 30 = +aacute
alt keycode 30 = +Aacute
altgr keycode 30 = U+0444 # CYRILLIC SMALL LETTER EF
altgr shift keycode 30 = U+0424 # CYRILLIC CAPITAL LETTER EF
<...>
keycode 32 = +d
shift keycode 32 = +D
control keycode 32 = +eth
alt keycode 32 = +ETH
Жирным выделены добавленные нами строки. Для редактирования файла ru.map рекомендую использовать Midnight Commander - клавиша F4 позволяет редактировать даже заархивированный файл. Потом вам останется только перезагрузиться и начать наслаждаться триязычием вашей консоли. Для особо ленивых аттачу исправленную вышеописанным способом копию файла ru.map.gz.