LINUX.ORG.RU

luit перекодирует cp1251 в что-то не то


0

1

Система: Fedora 16 x86_64

Возникла необходимость поработать в интерактивной утилите в консоли. Проблема в том, что утилита выводит в cp1251, а в консоли используется utf8. Соответственно вся кириллица при работе с утилитой становится нечитаемой.
Для решения проблемы решил запустить утилиту через luit. Теперь вместо кириллицы выводятся не белые знаки вопроса в чёрных шестиугольниках, а вполне читаемые символы... но латинские. И подбираемые по какой-то непонятной закономерности, на транслит не похоже. Например, пытаюсь через luit открыть в less файл, в котором сохранён кириллический текст в cp1251:

LANG=ru_RU.cp1251 luit less test.txt
и вижу следующее
j`j`ÿ-rn jhphkkhweqj`ÿ m`dohq|
Аналогичная картина наблюдалась, когда вызывал luit с ключом -encoding:
luit -encoding cp1251 less test.txt
Соответствующая локаль в системе стоит:
$ locale -a | egrep '.*ru.*1251.*'
ru_RU.cp1251
При попытке конвертировать тот-же файл через iconv выводится правильный кириллический текст:
$ iconv -f cp1251 test.txt
какая-то кириллическая надпись
Установленная локаль в консоли:
$ locale
LANG=ru_RU.utf8
LC_CTYPE="ru_RU.utf8"
LC_NUMERIC="ru_RU.utf8"
LC_TIME="ru_RU.utf8"
LC_COLLATE="ru_RU.utf8"
LC_MONETARY="ru_RU.utf8"
LC_MESSAGES="ru_RU.utf8"
LC_PAPER="ru_RU.utf8"
LC_NAME="ru_RU.utf8"
LC_ADDRESS="ru_RU.utf8"
LC_TELEPHONE="ru_RU.utf8"
LC_MEASUREMENT="ru_RU.utf8"
LC_IDENTIFICATION="ru_RU.utf8"
LC_ALL=
ЧЯДНТ?

Ответ на: комментарий от anonymous

Про LESSCHARSET я в курсе. Собственно, тут отобразить cp1251 в less - не самоцель. less я использовал для примера, чтобы можно было наглядно показать суть проблемы, и чтобы любой желающий мог её у себя воспроизвести с наименьшими усилиями. Цель - именно настроить нормальное отображение cp1251 через luit.

Betanuzir
() автор топика
Ответ на: комментарий от Betanuzir

там же написано: If that string is not found, but your system supports the setlocale interface, less will use setlocale to determine the character set. setlocale is controlled by setting the LANG or LC_CTYPE environment variables.

А среди ваших вариантов не было заметно locale + luit, так работает (cp1251 не проверял - лень устанавливать):

LC_ALL=ru_RU.KOI8R luit -encoding koi8r less /tmp/test

anonymous
()
Ответ на: комментарий от anonymous
iconv -f utf-8 -t cp1251 | <утилита> | iconv -f cp1251 -t utf-8

пофиксил

segfault ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.