Русификация syscons
Рассмотрим подробнее в чем заключается процесс русификации syscons. Еще раз напомню, что все основные настройки syscons делаются автоматически
при старте системы. Вам необходимо только правильно указать параметры
в файле /etc/rc.conf.
Итак, инструкция (FreeBSD Handbook) предлагает добавить в rc.conf строчки:
keymap=ru.koi8-r
keychange="61 ^[[K"
scrnmap=koi8-r2cp866
font8x16=cp866b-8x16
font8x14=cp866-8x14
font8x8=cp866-8x8
Начнем с последних строчек:
font8x16=cp866b-8x16
font8x14=cp866-8x14
font8x8=cp866-8x8
Они определяют аргументы для утилиты vidcontrol, которая должна будет загрузить в видео-контроллер новый набор шрифтов (подробнее в описании vidcontrol).
Почему рекомендуют шрифты cp866, хотя русификация FreeBSD подразумевает кодировку koi8-r, немного позднее.
Напомню, что для стандартного режима
"режима отображения" (25 строк) необходим только шрифт с матрицей 8x16.
Остальные два понадобятся только в том случае, если вы будете использовать
другие режимы (30, 43, 50 строк).
Кстати, если вы заглянете в /usr/share/syscons/fonts, то обнаружите, что шрифты в кодировке cp866 для матрицы 8x16 имеют три варианта - cp866, cp866b и cp866c (такой же набор имеется и для кодировки koi8-r).
Причем, cp866 и cp866c немного отличается набором символов - в cp866c часть
символов "псевдографики" заменена "экзотическими" буквами. А вот cp866b
сильно отличается внешним видом символов, причем и программа инсталляции
и большинство руководств по русификации усиленно навязывают именно его.
(Мне, например, он не нравится, но это дело вкуса).
Строчка - "scrnmap=koi8-r2cp866"
опять же задает аргумент для vidcontrol, но уже не для установки шрифтов,
а для загрузки в syscons таблицы перекодировки
(screenmap). Поскольку, шрифты рекомендуется поставить для кодировки cp866,
то для того, чтобы тексты в кодировке koi8-r отображались правильно, необходима эта
таблица - "из koi8-r в cp866".
Возникает вопрос - почему нельзя поставить шрифты сразу для кодов koi8-r и обойтись без какой-либо screenmap?
На самом деле - можно. Можно поставить шрифты для koi8-r, тем более, что в наборе шрифтов они есть и для всех трех матриц (а для 8x16, даже в нескольких вариантах - koi8-r, koi8-rb, koi8-rc).
Тогда соответствующие строчки в rc.conf будут выглядеть
scrnmap="NO"
font8x16=koi8-r-8x16
font8x14=koi8-r-8x14
font8x8=koi8-r-8x8
Однако, не торопитесь это делать. Дело в том, что шрифты cp866 лучше подходят для видеокарты "писишки".
Каждый символ на экране рисуется в матрице шириной в 9 точек, при этом "перерисовать" (загружая шрифты) можно только 8 из них. Девятая колонка
служит для того, чтобы символы, если они даже полностью занимают все восемь
"программируемых" колонок, все-таки не сливались между собой. С другой
стороны есть такие символы псевдографики, которые предназначены для рисования
рамочек и просто горизонтальных линий. Для них, наоборот, желательно, чтобы
они сливались, иначе горизонтальные линии будут выглядеть пунктирными.
Видео-контроллер, учитывает это и отрисовывает девятую колонку по-разному.
Для обычных символов эта колонка остается пустой (независимо от содержимого
остальных восьми колонок), а для псевдографических - девятая колонка точек
просто повторяет восьмую.
Проблема в том, что видео-контроллер имеет свое мнение о том, какие символы
являются псевдографическими (и, следовательно, должны сливаться в сплошную
линию), а какие - нет. Псевдографическими он считает символы с кодами в
диапазоне C0 - DF.
Так вот, в шрифтах cp866 "псевдографика" действительно попадает в этот
диапазон (и горизонтальные линии рисуются слитно), а в koi8-r - нет
(и те же линии рисуются пунктиром).
Другая проблема при использовании шрифтов koi8-r может возникнуть, если вы захотите включить поддержку "мыши" в syscons.
Дело в том, что для отрисовки графического курсора syscons перепрограммирует
шрифты для четырех символов (коды D0 - D3). В шрифтах cp866 эти коды попадают
на псевдографические символы (причем, редко используемые), а в koi8-r - на
буквы "п я р с". Естественно, если вы используете шрифты koi8-r, при
"мышевождении" эти буквы на экране портятся.
Правда, эта проблема имеет и другое решение. В последних версиях syscons, коды, используемые под "мышиный" курсор, можно изменить, пересобрав ядро
системы.
Поэтому, тот же "FreeBSD Handbook" советует для русификации первым делом пересобрать ядро, добавив в файл конфигурации
option "SC_MOUSE_CHAR=0x03"
Хороший совет, если не обращать внимание на то, что сама по себе пересборка ядра - задача более сложная (и требует значительно больше времени), чем
правка пары строк в rc.conf. (Кстати, и 0x03 - не очень удачная замена).
Вот эти причины и делают более предпочтительными шрифты cp866, хотя эффект от них чисто косметический.
Первая строчка - "keymap=ru.koi8-r" служит аргументом для утилиты kbdcontrol, которая при старте системы загрузит в syscons "раскладку
клавиатуры" ru.koi8-r.
Это раскладка с "альтернативной клавиатурой", в которой "буквенные" клавиши генерируют коды русских букв в соответствии с кодировкой koi8-r.
Естественно, в этой раскладке предусмотрен модификатор для переключения
между основной и "альтернативной" клавиатурами. Он "подвешивается" на клавишу
[CapsLock]. Если вам это не нравится, вы можете подправить сам файл "раскладки клавиатуры" (смотри пример Переключатель "альтернативной клавиатуры" (Рус/Лат).).
Кстати, если пересобрать ядро с "option RUKEYMAP", то эта раскладка будет "встроена" в syscons "по умолчанию". В этом случае, ее можно не загружать при старте системы.
А вот следующая строчка
keychange="61 ^[[K"
имеет к русификации косвенное отношение.
Дело в том, что загружая новые шрифты, мы меняем свойства терминала. По крайней мере, символы псевдографики перемещаются другой диапазон кодов. Следовательно, описание терминала cons25 в termcap уже не будет полностью соответствовать реальным свойствам syscons. Поэтому, для русифицированного
syscons в том же termcap предусмотрено другое описание и, соответственно,
другой тип терминала - cons25r. Именно поэтому, те же инструкции по
русификации рекомендуют подправить файл /etc/ttys (исправить все cons25 на cons25r) чтобы на каждом виртуальном терминале при старте очередной сессии переменная окружения TERM
(которая и сообщает программам тип терминала) по умолчанию получала значение cons25r.
Но описание терминала cons25r отличается от cons25 не только символами псевдографики. Согласно этому описанию, клавиша fkey61 (кнопка [Delete]) должна при нажатии выдавать последовательность кодов "Esc [ K", а не код 177, как это делает syscons (и как указано в описании терминала cons25).
Поэтому, нам рекомендуется "подрегулировать" сам syscons, чтобы его поведение соответствовало описанию в termcap. (Почему нельзя исправить
termcap и оставить syscons в покое, я не знаю).
Итак, эта строчка служит только для "подгонки" syscons к его новому описанию в termcap. Она представляет из себя аргумент для программы
kbdcontrol, которая заменит для клавиши fkey61 ([Delete]) выдаваемый код.
Рассмотренные рекомендации подразумевают, что вы будете использовать русскую кодировку koi8-r.
Как вы наверное знаете, существует по крайней мере еще две не менее популярные кодировки для русских букв cp866 и cp1251.
Можно ли заставить syscons (и дисплей, и клавиатуру) правильно работать с такими кодировками? Конечно, можно.
Как вы уже поняли, для дисплея необходимо загрузить соответствующие шрифты или screenmap, а для клавиатуры - таблицу "раскладки клавиатуры".
Кстати, для cp866 в системе уже есть все необходимое. То, что есть шрифты cp866 вы уже знаете (только надо убрать дополнительную перекодировку
через screenmap), подходящая "раскладка клавиатуры" - ru.cp866, также
имеется в /usr/share/syscons/keymaps.
А вот если вы хотите cp1251, то кое-что придется изготовить самостоятельно (или попросить у тех, кто уже сделал). Надо составить "раскладку клавиатуры" (назвать ее, например - ru.cp1251), а для дисплея проще всего делать не новые шрифты, а screenmap. Если у вас используются шрифты cp866, то надо просто изготовить табличку из 256 байт, которая будет транслировать коды из cp1251 в
cp866 (пусть она называется - cp1251-cp866) и "подсунуть" ее syscons.
Если вы хотите во время работы переключаться между различными кодировками, надо сделать три командных файла и запускать их в нужный момент.
Например, если не трогать шрифты (пусть это будут шрифты для cp866) и "перенастройку" дисплея делать с помощью screenmap, то эти файлы могут
выглядеть так:
- для cp866
kbdcontrol -l ru.cp866
vidcontrol -L
- для koi8-r
kbdcontrol -l ru.koi8-r
vidcontrol -l koi8-r2cp866
- для cp1251
kbdcontrol -l ru.cp1251
vidcontrol -l cp1251-cp866
Напомню только, что и шрифты, и "таблица перекодировки", и "раскладка клавиатуры" действуют на все виртуальные терминалы. Поэтому установить
для разных терминалов разные "типы русификации" не получится.
И, наконец, надо заметить, что русификация драйвера терминала, хотя и важная часть русификации всей системы, но не единственная.
Если вы хотите, чтобы все программы нормально понимали русский язык в кодировках отличных от koi8-r, вам придется еще менять переменную окружения
LANG (а возможно и некоторые другие). А для cp1251 еще и изготовить "locale" (набор таблиц, описывающих особенности национального языка). Кроме того, некоторые программы (например, чтения/писания почты) возможно придется
"отконфигурировать" индивидуально.
Но, для того, чтобы "по быстрому" просмотреть или подправить какой-нибудь документ в "нестандартной" кодировке, скорее всего "сойдет" и описанное
решение.
Иван Паскаль pascal@tsu.ru