[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