ENGLISH | KOI | WIN | ALT | ISO
Мои программы

Русификация 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" (набор таблиц, описывающих особенности национального языка). Кроме того, некоторые программы (например, чтения/писания почты) возможно придется "отконфигурировать" индивидуально.

Но, для того, чтобы "по быстрому" просмотреть или подправить какой-нибудь документ в "нестандартной" кодировке, скорее всего "сойдет" и описанное решение.