FreeBSD: UTF-8 в консоли и терминале


Локализация - I18N/L10N использование и настройка

1. Локализация консоли

необходим только в случае работы за локальной консолью.

Данный пункт локализации не требуется и не влияет на работу удаленных text-mode эмуляторов терминалов, таких как putty или openssh.

Итак, начиная с релиза FreeBSD 10.1 в системе для Russian UTF-8, в консольном драйвере vt (4) имеются:

- клавиатурные мапперы/переключатели:

# ls -la /usr/share/vt/keymaps/ | grep ru
-r--r--r--  1 root  wheel  16228 Nov 12 06:04 ru.kbd
-r--r--r--  1 root  wheel  16234 Nov 12 06:04 ru.shift.kbd
-r--r--r--  1 root  wheel  16232 Nov 12 06:04 ru.win.kbd

- фонты:

# ls -la /usr/share/vt/fonts/
-r--r--r--  1 root  wheel  8452 Nov 12 06:04 gallant.fnt
-r--r--r--  1 root  wheel  8742 Nov 12 06:04 vgarom-8x14.fnt
-r--r--r--  1 root  wheel  9864 Nov 12 06:04 vgarom-8x16.fnt
-r--r--r--  1 root  wheel  5384 Nov 12 06:04 vgarom-8x8.fnt
-r--r--r--  1 root  wheel  5400 Nov 12 06:04 vgarom-thin-8x16.fnt
-r--r--r--  1 root  wheel  2704 Nov 12 06:04 vgarom-thin-8x8.fnt

Шрифт gallant.fnt – красивый но не поддерживает кириллические символы.

Консольный драйвер vt (4) по умолчанию использует для работы режим VGA разрешением 640×480×16 (vt_vga).

Для использования UTF-8, необходимо произвести следующие действия:

- добавить в /boot/loader.conf строку:

kern.vty=vt

означает использование консольного драйвера vt вместо syscons

Согласно информации на https://wiki.freebsd.org/Newcons VT не поддерживает экранные заставки и выключение монитора в частности.
Поэтому все вопросы, касающиеся этой темы, можно считать решенными. Ответ на вопрос, как сделать включение заставки в VT, ответ – НИКАК

Если потребуется собрать собственное ядро, только с новым драйвером консоли, необходимо в ядро добавить:

#-- закомментарить *vga*, *sc* и оставить только *vt*
#device        vga             # VGA video card driver                 
#device        sc                                                      
device         vt                                                              
device         vt_vga

ps. ядро GENERIC 10.1 уже собрано с поддержкой vt (4) (man vt).

- добавить в /etc/rc.conf

#-- Russians keymap, uncomment that you preffer
# CAPS switch to russian
keymap="ru"
# SHIFT switch to russian, top keyboard raw as number
#keymap="ru.shift"
# CTRL+SHIFT switch to russian
#keymap="ru.win"
#-- font load
font8x16="vgarom-8x16"

Шрифт vgarom используется системой по умолчанию, можно не задавать, указан как пример задания фонта, когда появится выбор. верхнее означает что на данный момент можно использовать, как это было и ранее, три варианта клавиатурного маппинга, любой который Вам удобнее, раскомментарьте один, который Вам предпочтительней (выше это keymap=«ru»):

- keymap="ru" – переключение на русский клавишей CAPS Lock
- keymap="ru.shift" – переключение на русский клавишей CAPS Lock, но верхний ряд на клавиатуре по умолчанию будет цифровой
- keymap="ru.win" – переключение на русский клавишами CTRL+SHIFT

выбор фонтов пока отсутствует, по умолчанию в наличии пока лишь следующие:
gallant.fnt – красивый, но не поддерживает русский
vgarom-8×8.fnt – матрица 8×8 с поддержкой русских символов
vgarom-8×14.fnt – матрица 8×14 с поддержкой русских символов
vgarom-8×16.fnt – матрица 8×16 с поддержкой русских символов
vgarom-thin-8×8.fnt
vgarom-thin-8×16.fnt

Консольные фонты Terminus, можно скачать:
фонт 8×16: ter-u16.fnt
чуть другой фонт 8×16: ter-u8x16.fnt
фонт 16×32: ter-u32.fnt

загрузить вручную, например:

# vidcontrol -f ter-u32.fnt

или положить в /usr/share/vt/fonts/ и настроить /etc/rc.conf, например:

font8x16="ter-u8x16.fnt"

Шрифты 16×32 нужны(удобны) для широкоформатных мониторов, для загрузки фонта ter-u32.fnt (16×32), нужно изменить скрипт /etc/rc.d/syscons или использовать /etc/rc.local и /etc/rc.conf.local для загрузки 16×32 фонтов.

Тип эмулируемого терминала для UTF-8 консоли: xterm

Начиная с 9.0, для syscons (4) драйвера и очень важно – для vt (4) драйвера, в /etc/ttys необходимо использовать тип эмулируемого терминала xterm:

ttyv0   "/usr/libexec/getty Pc"         xterm   on  secure
# Virtual terminals
ttyv1   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv2   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv3   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv4   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv5   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv6   "/usr/libexec/getty Pc"         xterm   on  secure
ttyv7   "/usr/libexec/getty Pc"         xterm   on  secure

Ранее, syscons (4), для KOI8-R тип эмулируемого терминала cons25r, для KOI8-Ucons25u. Для CP437 (VGA default) – cons25, US-ASCIIcons25w.

При использовании KMS драйверов: i915kms или radeonkms в /boot/loader.conf добавить:

kern.vt.fb.default_mode="1024x768"

Для использования vt (4) драйвера в text-mode, /boot/loader.conf:

hw.vga.textmode=1

Если ядро собрано с поддержкой обоих драйверов: *sc*(4) и *vt*(4), старый драйвер можно вернуть, задав в /boot/loader.conf:

kern.vty=sc

2. Локализация login shells и использование login class.

Описан в FreeBSD HandBook и выполняется как обычно, локализация login shell’ов и может быть использована совместно с настройкой login class через описание его в /etc/login.conf

Локализация представляет из себя следующую конструкцию:

LanguageCode_CountryCode.Encoding

где: LanguageCode_Country Code Description можно выбрать одно из значений:
en_US English, United States ru_RU Russian, Russia

команда покажет все присутствующие в системе locale:

# locale -a | more

Работа с charater set (charset) для языков, например:

– ISO8859-1, ISO8859-15, KOI8-R, CP1251, CP437 и тд и тп описана в multibyte (3), а список charsets для языков можно найти в IANA Registry

FreeBSD использует Xorg-compatible locale encodings.

1) использование login класса

- можно отредактировать /etc/login.conf и изменить настройки класса «russian» или создать отдельный класс russianu

a) изменяем класс russian в /etc/login.conf

russian|Russian Users Accounts:
        :charset=KOI8-R:
        :lang=ru_RU.KOI8-R:
        :tc=default:

на

russian|Russian Users Accounts:
        :charset=UTF-8:
        :lang=ru_RU.UTF-8:
        :tc=default:

или

b) создаем в дополнение к классу «russian», новый класс «russianu»

russianu|Russian Users Accounts UTF-8:
        :charset=UTF-8:
        :lang=ru_RU.UTF-8:
        :tc=default:

По завершении перестраиваем хеш-базу:

# cap_mkdb /etc/login.conf

Все, осталось перевести пользователей которым нужен UTF-8 на новый класс используя на выбор: passwd (1), pw (8), chpass (1), vipw (8)

Пример:

# pw user mod alex -L russianu

2) настройка locale в shell/bash/csh/tcsh

для настройки локализации в шелах, необходимо соответствующим образом настроить тот или иной shell, см. соответствующий man

Настройка локализации в login shell’ах сводится как минимум к заданию переменных:

LANG
MM_CHARSET

в пользовательских файлах: ~/.login_conf и/или пользовательских стартап

shell файлах: ~/.profile, ~/.bashrc, или ~/.cshrc.

sh/bash:

export LANG=ru_RU.UTF-8
export MM_CHARSET=UTF-8

csh/tsch:

setenv LANG ru_RU.UTF-8
setenv MM_CHARSET UTF-8

Или в системных стартап shell файлах: /etc/profile и /etc/csh.login

Для bash необходимо создать в домашней директории файл .inputrc

set convert-meta Off
set input-meta On
set output-meta On

Перекодировка имен файлов и директорий.
- необходимо установить и использовать утилиту convmv, из пакетов или портов

# pkg install converters/convmv
# make -C /usr/ports/converters/convmv install clean
# man convmv

пример использования:

# convmv -f koi8-r -t utf-8 *
# convmv -f koi8-r -t utf-8 --notest *
# convmv -r -f koi8-r -t utf-8 --notest *

При использовании утилиты convmv, возможны проблемы с перекодированием отдельных символов.

Перекодировка содержимого файлов.

Можно воспользоваться утилитами iconv и recode:

- iconv (интегрирована в FreeBSD 10.x)

- /usr/ports/converters/libiconv в более ранних версиях

примеры использования:

iconv:

# man iconv
# iconv -c -f koi8-r -t utf-8 inputfile
# iconv -c -f koi8-r -t utf-8 inputfile > outputfile
# iconv -c -f koi8-r -t utf-8 < inputfile > outputfile

recode:

# make -C /usr/ports/converters/recode install clean
# man recode
# recode koi8-r..utf-8 inputfile
# recode koi8-r..utf-8 < inputfile > outputfile

При использовании утилиты iconv, возможны проблемы с перекодированием отдельных символов, утилита recode, работает более адекватно.

Удаленный терминальный доступ.

Для удаленного терминального доступа из системы с UTF-8 локализацией к системам с locale отличной от UTF-8, можно воспользоваться утилитой luit:

пример использования luit (man luit):

# luit -encoding "KOI8-R" slogin username@host.domain

в качестве encoding использовать charset соответствующие удаленному locale, в данном примере KOI8-R

Удаленный терминальный доступ из Windows в Unix-like OS с locale UTF-8:

- использование утилиты putty, настройка:

Putty -> Window -> Translation -> Remote character set: UTF-8

3. Локализация Xorg

осталась неизменной, так как основная масса DE, WM и X-Apps в настоящее время ориентирована на работу с UTF-8, больше не нужно использовать shell-wrapper’ы или переопределять переменную LANG для их запуска.

фонты в Xorg:

- при использовании locale == ru_RU.UTF-8, необходимо использовать фонты с поддержкой iso10646

- misc содержат исправленные фонты iso10646, но по умолчанию не прописаны в fonts.aliases, если есть привычка использования алиасов, придется прописать их самостоятельно.

Например, как советует Markus Kuhn Unicode fonts and tools for X11.

- фонты misc с iso10646 и остальные фонты с iso10646, необходимо указывать первыми в xorg.conf

например так:

FontPath     "/usr/local/lib/X11/fonts/misc/"
        FontPath     "/usr/local/lib/X11/fonts/100dpi/"
        FontPath     "/usr/local/lib/X11/fonts/75dpi/"
        FontPath     "/usr/local/lib/X11/fonts/terminus-font/"
        FontPath     "/usr/local/lib/X11/fonts/bitstream-vera/"
        FontPath     "/usr/local/lib/X11/fonts/dejavu/"
        FontPath     "/usr/local/lib/X11/fonts/freefont/"
        FontPath     "/usr/local/lib/X11/fonts/unifont/"
        FontPath     "/usr/local/lib/X11/fonts/local/"
        FontPath     "/usr/local/lib/X11/fonts/webfonts/"
        FontPath     "/usr/local/lib/X11/fonts/urw/"
        FontPath     "/usr/local/lib/X11/fonts/cyrillic/"
        FontPath     "/usr/local/lib/X11/fonts/artwiz-ru/"
        FontPath     "/usr/local/lib/X11/fonts/freefont-ttf/"
        FontPath     "/usr/local/lib/X11/fonts/urwfonts-ttf/"
        FontPath     "/usr/local/lib/X11/fonts/TTF/"
        FontPath     "/usr/local/lib/X11/fonts/OTF/"
        FontPath     "/usr/local/lib/X11/fonts/Type1/"

Вы можете установить собственные предпочтения.

посмотреть установленные фонты:

# fc-list
# ls -laR /usr/local/etc/fonts/

- посмотреть фонты iso10646

# xlsfonts | grep iso10646
# xlsfonts | grep "-misc-fixed-medium" | grep iso10646 
# xlsfonts | grep "-misc-fixed-medium-r-semicondensed" | grep 10646

графические эмуляторы терминала с encoding, примеры с KOI8-R:

- mate-terminal, gnome-terminal:

# sh -c "export LANG=ru_RU.KOI8-R CHARSET=KOI8-R; gnome-terminal --geometry 80x35 --disable-factory"
# sh -c "export LANG=ru_RU.KOI8-R CHARSET=KOI8-R; mate-terminal --geometry 80x35 --disable-factory"
# sh -c "export LANG=ru_RU.KOI8-R CHARSET=KOI8-R; xfce4-terminal"

переменные среды LANG,CHARSET в соответствии с использованием locale, например на удаленной стороне, или для локальной работы с файлами в KOI8-Rxterm с encoding

# xterm -en [koi8-r|cp1251|...]

4. Локализация Applications (приложений).

Зависит исключительно от написания приложения в соответствии со стандартом i18n и работой с базами termcap в случае xBSD или terminfo в случае Linux или SYSV-based для эмулируемого терминала TERM.

К сожалению, консольных фонтов пока, очень мало, не говоря уже о хороших и красивых фонтах.
Некоторые фонты и клавиатурный маппинг от Александра Рыбалко, можно найти:
https://people.freebsd.org/~ray/newcons/fonts/
https://people.freebsd.org/~ray/newcons/newcons_kbd/
https://people.freebsd.org/~emaste/newcons/

Пример конвертации bdf фонта в fnt используя vtfontcvt и его загрузку используя vidcontrol, см: https://wiki.freebsd.org/Newcons

Минимум позволяющий работать в консоли с UTF-8:
- отображение – /usr/bin/less (использовать в качестве PAGER)
- редактирование – /usr/bin/vi , редактор Vi в 10.1 собран с поддержкой wide-char
- псевдографика в mc выглядит красиво, встроенный редактор поддерживает utf-8
- любимый многими, простой редактор /usr/bin/ee не поддерживает utf-8, отображает криво, но позволяет набирать текст «вслепую».
- настройку chrasets и работу samba3x, samba4x – не проверял

Все вышенаписанное проверено на реальном железе с FreeBSD 10.1 и в гостевой FreeBSD 10.1 под VirtualBox, включая Xorg и несколько DE и WM.

Практика:
- используем syscons (4) для работы в консоли с KOI8-R, CP1251, CP866
- используем vt (4) для работы в консоли только с UTF-8

Вывод: наконец можно постепенно избавиться от разнообразия: CP866,CP1251,KOI8-R и тд и тп и использовать одну универсальную кодировку UTF-8.

источник: http://unix1.jinr.ru/~lavr/vt/vtcons.html


Оцените статью или поделитесь ей в соцсетях:

+ 0 | - 0

Рекомендуемые статьи:


Комментарии

  1. Иван 14 Август 2018
    Статье уже два года, а FreeBSD так и не научилась переключаться с X.org на virtual console, если видяха от Nvidia. Еще лет пять пройдет прежде чем vt будет работать хотябы немного так же стабильно как sc.

Оставьте комментарий!

Поля обозначенные как * требуются обязательно. Перед постингом всегда делайте просмотр своего комментария.