Настройка системы
Если у вас клавиатура уже руссифицирована каким-нибудь "старым" способом (с помощью xmodmap или программ-руссификаторов xruskb, xes и т.п.), то уберите их. Они будут только мешать. Во всяком случае, если будет "очень надо", вернете их потом.
Короче, позаботьтесь о том, чтобы у вас не было русского .Xmodmap
в домашней директории (и/или в {XROOT}/lib/X11/xinit/) и никакие xruskb не стартовали бы автоматически при запуске "иксов".
Итак. Прежде всего убедитесь, что у вас правильно установлены "русские фонты". Для этого нужно взять текст, "набитый" в koi8 (например, в какой-нибудь "консольной" программе). Если он нормально читается в xterm, то шрифты установлены "правильные". (Как установить "кириллические" шрифты я здесь описывать не буду. В Интернете достаточно инструкций на эту тему.)
Дальше. Проверьте, что у вас правильно установлена locale. Обычно она устанавливается переменной окружения LANG. Убедитесь, что значение этой переменной указывает на существующие файлы для "libc'ишной" locale (в /usr/share/locale) и "иксовой" locale (через locale.dir и, если нужно, locale.alias).
Не полагайтесть на результаты выдачи команды locale. В некоторых случаях она может показывать не совсем то, что и процедура setlocale()
вызываемая внутри прикладных программ.
Если будут проблемы, можете воспользоваться моей тестовой программкой testXlc.
Она определяет
- "системную" locale,
- locale для Xlib,
- полный путь до файла XLC_LOCALE,
- значения некоторых классов "иксовой" locale,
- в том числе - "encodingName" (которое влияет на работу *LookupString).
Для "сборки" этой программы надо последовательно набрать команды
xmkmf make
Надо также заметить, что эта программа использует внутренние процедуры Xlib (не предназначенные для вызова в прикладных программах). Поэтому, нет гарантии, что она будет "собираться" и правильно работать во всех версиях XFree. Во всяком случае, она должна давать требуемый результат в версиях 3.3.2, 3.3.3, 3.3.3.1.
Далее. Можно проверить, что XKB действительно переключается на "русскую" раскладку и выдает коды Cyrillic.
Для этого можно воспользоваться программой xev (если ее нет в вашей системе, то можно найти ее в XFree86-contrib).
Вообще-то, это "универсальный тестер" "событий" (X events). Ее надо запустить из под xterm. При нажатии кнопок она должна писать что-то вроде этого
KeyPress event, serial 21, synthetic NO, window 0x5800001, root 0x25, subw 0x0, time 3744190622, (533,270), root:(610,437), state 0x2000, keycode 38 (keysym 0x6c6, Cyrillic_ef), same_screen YES, XLookupString gives 0 characters: ""
KeyRelease event, serial 21, synthetic NO, window 0x5800001, root 0x25, subw 0x0, time 3744190755, (533,270), root:(610,437), state 0x2000, keycode 38 (keysym 0x6c6, Cyrillic_ef), same_screen YES, XLookupString gives 0 characters: ""
Обратите внимание, что если у вас клавиатура перключена в "русский режим", то в третей строчке сообщения должно быть название Cyrillic кода клавиши
Кстати, xev - "неправильная" программа. Если сделать ее "правильной", добавив в начале вызов (и "пересобрав" ее)
setlocale(LC_CTYPE, "");
то она будет показывать и результат трансляции Cyrillic кодов в koi8-r
(ну, или iso8859-5), например -
KeyPress event, serial 21, synthetic NO, window 0x5800001, root 0x25, subw 0x0, time 3744190622, (533,270), root:(610,437), state 0x2000, keycode 38 (keysym 0x6c6, Cyrillic_ef), same_screen YES, XLookupString gives 1 characters: "ф"
KeyRelease event, serial 21, synthetic NO, window 0x5800001, root 0x25, subw 0x0, time 3744190755, (533,270), root:(610,437), state 0x2000, keycode 38 (keysym 0x6c6, Cyrillic_ef), same_screen YES, XLookupString gives 1 characters: "ф"
Ну и, наконец, надо убедится, что у вас не XFree86 3.3.3 (хотя с этого надо было начинать :-).
(Надо бы написать простенький "тестер", который проверяет правильность работы *LookupString при заведомо правильной encoding_name. Но пока сойдет "подправленная" xev. Она, кстати, использует только XLookupString.)
Итак, если
- у вас стоят "кириллические" шрифты;
- программа testXlc показала, что название "системной" и "иксовой" locale совпадают, и значение "encodingName" - KOI8-R;
- xev показывает Cyrillic коды;
- "поправленный" xev транслирует их в нормальные koi8-r коды;
то система у вас настроена. И "правильные" программы должны работать нормально.
А вот что делать с "неправильными" программами - разговор отдельный...