[Devel-conf] UNICODE в консоли - что и где надо фиксить
Stanislav Ievlev
inger на altlinux.org
Пн Авг 15 13:27:43 MSD 2005
Излагаю результаты полудневного исследования проблемы "Почему при старте у
нас не работает Unicode".
Интрига:
То что фонт якобы надо грузить на каждой консоли - это "миф".
setfont совершенно замечательно отрабатывает на все консоли сразу.
Реальная проблема в недоделке в одном месте и недостаче в другом.
Что было:
При старте отрабатывал /sbin/setsysfont, который сначала выставлял шрифт
через setfont, а потом вызывал unicode_start, а потом догружал acm, если
надо
При входе в систему отрабатывали из profile.d lang.sh и console.sh -
последний в случае unicode ничего не делал ибо там acm не требуется
Бага #1:
Мы используем unicode_start похоже не так как это
предполагал RH
Посмотрите внимательно в этот фрагмент:
--
DEFAULT_UNICODE_FONT=LatArCyrHeb-16
# Also drdos8x16 is a good candidate.
case $# in
2)
setfont $1 -u $2
;;
1)
setfont $1
;;
0)
setfont $DEFAULT_UNICODE_FONT
;;
*)
echo "usage: unicode_start [font [unicode map]]"
;;
esac
--
У нас unicode_start вызывается без аргументов ибо нам не нужно ещё раз
выставлять фонт, а он выставлялся и выставлялся в совершенно левое
значение - иначе говоря его по ходу загрузки кто-то и где-то вообще
срубал. Подробнее не скажу ибо эти пряди бородатого кода (rc.sysinit и
/sbin/setsysfont) без пол-литра вообще не разберёшь.
Там ещё setsysfont грузится для поправки шрифтов для fb - я всё проверял
без fb. Надо бы проверить ещё и с ним, но я просто не успел.
Как фиксить:
Не фига нам по двадцать раз шрифты перегружать
Предлагается убрать вообще весь этот хвост из unicode_start
Если это жизненно необходимо - приведите пример, у меня после того
как я убрал эту вторичную перегрузку шрифта всё заработало "на ура"
Проблема #2:
mingetty при выводе issue ресетит терминал посылая ему \033c
Поэтому при входе/выходе в систему половина настроек терминала слетает.
На этот случай у нас и существует console.sh, который перевключает
acm, посылая повторно \033(K.
при ресете слетает и режим unicode (unicode_start посылает \033%G),
поэтому его надо восстанавливать так же как и acm - у нас этого
просто не было вообще.
Как фиксить:
Ну сам фикс-то простой, строчки следующего вида:
--
case "$LANG" in
*.utf8|*.UTF-8)
[ -x /usr/bin/unicode_start ] && /usr/bin/unicode_start
;;
esac
--
Но вот вопрос, куда его вставлять в /etc/profile.d?
console.sh не годится ибо там нету ещё LANG
В lang.sh самое место, но идеологически это в другом пакете получается
RH держит все эти хаки для консоли прямо в lang.sh
Результаты фиксов:
После фикса unicode_start (удаления хвоста скрипта с лишним setfont) и
lang.sh у меня тьфу-тьфу всё завелось - я пробовал без режима fb, но по
идее и он должен работать ибо все фиксы были только вокруг одного скрипта
unicode_start
Одно но:
У нас рут работает под POSIX
Если в режиме POSIX не сделать unicode_start (но грузить шрифт ес-но)
то работает нормально mc,
но ес-но ничего русского не выводится,
если сделать unicode_start
то русский появится, но mc в таком режиме колбасит.
А в lang.sh проверка как помните была на локаль именно utf.8.
В общем предлагаю ldv посмотреть это и решить куда вставлять вызов из
profile.
unicode_start живёт в kbd, поэтому в силу "отсутствия де факто" мантейнера, можно фиксить его кому угодно.
Кроме того замечено, что плющит и клобасит read-line в режиме UTF-8.
Дима, пожайлуста, посмотри. Там как-то не очень понятно кого плющит больше
- сам readline или терминал.
Ну вот и всё ... давайте обсуждать и фиксить.
--
Стас.
Подробная информация о списке рассылки Devel-conf