У сабжа есть опция -en которая позволяет на лету перекодировать вывод
Вопрос где хранятся файлы перекодировки и в каком они формате
Если бы вы читали маны, то, наверное, узнали бы, что перекодировкой за xterm занимается программка luit. Более того, там сказано, что список поддерживаемых кодировок можно получить командой luit -list, а если бы вы, не удовлетворившись уже добытыми знаниями, читали дальше, то к своему удивлению выяснили бы, как выяснил я, что все ресурсы лежат в /usr/X11R6/lib/fonts/encodings. Кодировки перечислены в файле encodings.dir, а описаны в отдельных файликах примерно так:$ zcat microsoft-cp1251.enc.gz
STARTENCODING microsoft-cp1251
# This file is derived from data provided by the Unicode Consortium
STARTMAPPING unicode
0x80 0x0402 # CYRILLIC CAPITAL LETTER DJE
0x81 0x0403 # CYRILLIC CAPITAL LETTER GJE
0x82 0x201A # SINGLE LOW-9 QUOTATION MARK
0x83 0x0453 # CYRILLIC SMALL LETTER GJE
0x84 0x201E # DOUBLE LOW-9 QUOTATION MARK...
0xFD 0x044D # CYRILLIC SMALL LETTER E
0xFE 0x044E # CYRILLIC SMALL LETTER YU
0xFF 0x044F # CYRILLIC SMALL LETTER YA
ENDMAPPING
ENDENCODING
Скажем так, из моего поста нигде не видлно что маны я не читаю
Ведь не от хорошей жизни я полез в -en опцию, а не пробую заморочится с luit
Проблема выглядит примерно так:
# luit -encoding /usr/X11R6/lib/X11/fonts/encodings/ibm-cp866.enc
Warning: couldn't find charset /usr/X11R6/lib/X11/fonts/encodings/ibm-cp866.enc; using ISO 8859-1.
#pwd
/usr/X11R6/lib/X11/fonts/encodings/
# ls -l
[skip]
-r--r--r-- 1 root root 5536 Дек 10 2003 ibm-cp866.enc
[skip]
В чем грабли, ибо в манах это все не написано, по крайне мере я не нашел.
А в общее известные факты носом пихать самое легкое>Если бы вы читали маны, то, наверное, узнали бы, что перекодировкой за
>xterm занимается программка luit. Более того, там сказано, что список поддерживаемых
>кодировок можно получить командой luit -list, а если бы вы, не
>удовлетворившись уже добытыми знаниями, читали дальше, то к своему удивлению выяснили
>бы, как выяснил я, что все ресурсы лежат в /usr/X11R6/lib/fonts/encodings. Кодировки
>перечислены в файле encodings.dir, а описаны в отдельных файликах примерно так:
>
>
>$ zcat microsoft-cp1251.enc.gz
>
>STARTENCODING microsoft-cp1251
># This file is derived from data provided by the Unicode Consortium
>
>STARTMAPPING unicode
>0x80 0x0402 # CYRILLIC CAPITAL LETTER DJE
>0x81 0x0403 # CYRILLIC CAPITAL LETTER GJE
>0x82 0x201A # SINGLE LOW-9 QUOTATION MARK
>0x83 0x0453 # CYRILLIC SMALL LETTER GJE
>0x84 0x201E # DOUBLE LOW-9 QUOTATION MARK
>
>...
>
>0xFD 0x044D # CYRILLIC SMALL LETTER E
>0xFE 0x044E # CYRILLIC SMALL LETTER YU
>0xFF 0x044F # CYRILLIC SMALL LETTER YA
>ENDMAPPING
>ENDENCODING
Sorry, если обидел ;-)
Кажется, для того чтобы luit -list выдавал в списке CP866 нужна русская локаль с этой кодировкой
т.е. надо сделать что-то вроде
localedef -v -c -i ru_RU -f CP866 ru_RU.CP866
от root. Я это не смог проверить - без root'а не хочет.
>Sorry, если обидел ;-)
Ничего :))) Я тож малость вспылил
Совсем чайниковский вопрос - у меня нет этой локали (ASP linux 9.2).
Где ее взять или как ее добавить или куда хоть смотреть, а то в области русификации линуксов у мя полный провал знаний.Спасибо большое
>Кажется, для того чтобы luit -list выдавал в списке CP866 нужна русская
>локаль с этой кодировкой
>т.е. надо сделать что-то вроде
>localedef -v -c -i ru_RU -f CP866 ru_RU.CP866
>от root. Я это не смог проверить - без root'а не хочет.
>
>вопрос - у меня нет этой локали (ASP linux 9.2).
>Где ее взять или как ее добавить или куда хоть смотреть
>>Кажется, для того чтобы luit -list выдавал в списке CP866 нужна русская
>>локаль с этой кодировкойНичего себе... Я посмотрел - в этом luit кодировки прописаны намертво и 866 среди них нету.
Я его чуть-чуть поредактировал и положил патч и бинарник в http://hatta.narod.ru/patchedluit.zip
Надеюсь поможет.
P.S. Исходники luit'а лежат в xc/programs/luit дерева XFree86 и X.org
Спасибо, сейчас буду разбираться?
А у тя аська есть? Моя 64828034
И если заработает скорлько с меня пива и куда отправлять:)?
>Ничего себе... Я посмотрел - в этом luit кодировки прописаны намертво и
>866 среди них нету.
>Я его чуть-чуть поредактировал и положил патч и бинарник в http://hatta.narod.ru/patchedluit.zip
>Надеюсь поможет.
>P.S. Исходники luit'а лежат в xc/programs/luit дерева XFree86 и X.org
Я обновил бинарник - он теперь статически слинкован. НО:
1. у меня glibc 2.3 и соответственно NPTL
значит, он не запустится на ядре 2.4
2. у меня проинсталенна вручную локаль ru_RU.IBM866
значит, нужно сделать
localedef -c -v -f IBM866 -i ru_RU ru_RU.IBM866запускается этот luit так: luit -encoding IBM866
у меня работает и перекодирует из 866 в UTF8
>у меня работает и перекодирует из 866 в UTF8
У меня тоже перекодируют, но режутся функциональные клавиши,
причем режутся на уровне XLib, соответственно я делаю вывод
что мне нужна XLocale CP866. А как ее можно собрать или куда рыть?Да, патченный luit мне выдает сообщение
can't sel current locale или что то похожее,
если надо кину более точно
>У меня тоже перекодируют, но режутся функциональные клавиши,
Вы знаете, у меня запускается xterm с этим luit, я в нем вызываю lynx,
выбираю там Display Character Set = cp866 и смотрю русские странички, а когда нажимаю F1, он мне показывает справку... так что я не понимаю, какие могут с этим возникнуть проблемы.>Да, патченный luit мне выдает сообщение
>can't sel current locale или что то похожее,
>если надо кину более точноНаверное, я уже надоел со своим localedef, но все выглядит так, как будто у вас нет скомпилированного описания локали ru_RU.IBM866.
Забыл, самое главное: у меня
XFree86 4.4
linux 2.6.7-rc1
glibc-2.3
и LANG=ru_RU.UTF-8
Лучше я расскажу все по порядку :))
У меня есть сервер базы данных под юнихом, он отдает все данные в ср866.
Под него написанна клиентская программа, по доступу. Пользователи заходят телнетом, стартуют программу и работают. Под виндой все было великолепно, использовался правда не стандартый клиент а Reflection с куячей навотротов.И вот появилась задача перевести офис или его часть на линух. Сели смотреть
первое решение для консоли которое пришло в голову - шеллом пользователю поставить telnet servet_ip и все хорошо заработало, кроме русского ввода :)) Как то с ср-шной кодировки не хотелось вводится :)) поэтому от этого варианта отказались.
Следующий шаг по разборке с консолью закончился следующим
#setfont cp866-8x16 -m cp866
#loadkeys /lib/kbd/keymaps/i386/qwerty/ru2.map.gz
#telnet server_ip
Но во первых летела локаль, вернее русский вывод. Во вторых эта операция хорошо выполняется под рутом, но я очень сумневаюсь что она выполнится под простым юзером, а давать всем юзерам рута - не по себе становится.Но в принципе хоть какой то результат достигнут, и мы полезли выше - а выше Иксы. Я запустил Гном-терминал, и был приятно поражен тем, что все перевелось с полпинка, не считая небольшой мелочи - нельзя было использовать функциональные клавиши(Ф1-Ф..). Фигня подумал я :)) скорее всего умные парни и КДЕ сделали свой терминал намного лучше. И правда,
запускаю я их Консоль , в параметрах соеденения нахожу вкладочку - тип терминала, меняю на линукс (как на сервере, кстате, забыл сказать на сервере термкап обработали напильником немного, так как там был еще и загадочный терминал, деталей не знаю, так как делал не я)
и полез коннектится. Да, все функциональные клавиши работают, проблема в том что вывод не перекодируется из ср866 в мою локаль ср1251.Фигня подумал я. Счас интернет поднимем науши и какой то патчик найдем что
бы объеденить эти две удобные программы. Патчик я не нашел, но понял что все дороги ведут к xterm. Так началась очередная глава.
Перерыв man на xterm я нашел три опции которые по идее должны меня спасти
-en - которая указывает путь к файлу перекодировки, но эта опция устарела и надо пользоваться
-lc - которая включает luit для автоматической перекодировки
и еще меня крепко заинтересовала опция
-fn в которой надо указать имя используемого фонтаЭтап половых извращений с xtermом я описыватьт не хочу, так как всего не помню, но в какой то момент я запостил свой вопрос на форум. Вы абсолютно верно сказали мне, что дело в luit, скорее даже не в нем самом, покай не мере у меня, а в отсутствии на моей машине локали cp866. Ведь luit используется для перекодировки на лету между локалями. На этом этапе благодаря ващей подсказке я полностью перерыт ман на localedef и сделал свою ср 866 локаль. В консоли все стало просто великолепно ( не считая того что не работает бекспейс и буква "ы", но я где то в нете видел доку по тому как это обработать напильником, правда сейчас не могу найти адрес).
Довольный и предвкушающий я запустил иксы и ломанулся в гном-терминал. Он транслировал все без дополнительных пинков, но функциональные клавиши не работали все также. Ну сейчас парни из КДЕ покажут почему КДЕ рулит, подумалось мне, когда я запускал Консоль. Действительно, проблем с кодировкой не было, но появилась проблема с функциональными клавишами, я кинулся исправлять по проверенному мною пути - меняя тип терминала, но ничего не произошло. Я решил проверить что скажет xterm
# xterm
Warning: locale not supported by Xlib, locale set to C
это на патченном луите
[root@it_troll /]# xterm
Warning: could not find charset for ru_RU.ibm866; using ISO 8859-1
а это на непатченном
Соответственно он не перекодирует
Единственный вывод, который я могу сделать - надо точно так же как и локаль (LOCALE) самому собирать XLOCALE для ср866. Тогда все должно заработать.На этом этапе я и заткнулся
В связи с тем, что вы поведали у меня возникает несколько вопросов
1. Программа-клент не занимается никакой обработкой строк, циркулирующих между пользователем и БД, не так ли?
2. Для функционирования xterm с опцией -en должны выполняться некоторые условия, а именно, он должен запускаться из-под локали ru_RU.UTF-8, либо с опцией -u8, включающей поддержку unicode; шрифт тоже должен быть юникодным, т.е. что-то вроде -misc-fixed-medium-r-*-*-13-*-*-*-*-*-iso10646-1, эти шрифты можно взять из пакета ucs-fonts
http://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html
хотя, они наверняка есть в вашей системе.
3. Насчет функционеальных клавиш... вы уверены, что дело не в передолбанном termcape? Можно попробовать заменить его на сервере на время. В принципе, если termcap подстраивался под этот Reflection, то это не должно было задеть xterm, но в любом случае в termcap'е куча записей для разных xterm'ов попробуйте с ними поиграться... (export TERM=xterm-xf86-v33) и так далее... На крайняк можно испробовать одну из опций в ресурсах - (sun|hp|sco)FunctionKeys, oldXTermFKeys