(возьмите это с щепоткой соли) Насколько я помню, проблема заключается в том, как libiconv
работает. Многобайтовым кодировкам нужен конечный автомат для их декодирования, и он libiconv
предпочитает получать целые символы, поэтому вы не можете просто дать ему половину символа в одном вызове функции, а другую половину - в следующем.
Я могу придумать еще два решения: одно - хороший внеполосный метод, другое - внутриполосный хак.
Изменить кодировку эмулятора терминала (внеполосно) : один из них - изменить кодировку символов в эмуляторе терминала, поэтому его родной кодировкой является Shift JIS. Я только что проверил konsole
, и это поддерживает. В меню View → Кодировка символов → Japenese → sjis. Затем вы можете просто tail -f
файл и konsole
позаботиться о декодировании многобайтовых символов и сопоставлении их до глифов шрифта.
Транскодирование терминала на лету (внутриполосное; лучшее) : любезно предоставлено Жилем, который напомнил мне luit
после очень долгого времени. Используйте luit
, который должен был поставляться с вашим дистрибутивом XOrg (в Debian это пакет x11-utils
). Используйте это так:
$ luit -encoding SJIS -- tail -f x
Это заставит терминал перекодировать SJIS в кодировку вашего терминала и запустить его tail -f x
. Недостатком luit
является то, что он не поддерживает множество поддерживаемых кодировок libiconv
. Плюс это доступно практически везде.
Транскодирование терминального кодирования на лету (in-band; hack) : ttyconv
это хак, который я написал много лет назад (первоначально в C, позже переделанный в Python), который используется libiconv
для перекодирования терминального ввода-вывода. Он порождает новый псевдотерминал и (а) транскодирует символы, которые вы вводите из вашей локальной кодировки, в удаленную кодировку, и (б) транскодирует символы, которые вы получаете от удаленной кодировки, в вашу локальную кодировку. Я использовал его для общения с серверами, которые использовали кодировки, не поддерживаемые стандартными терминалами Linux. Обратите внимание, что все удаленные кодировки, которые я тестировал, были однобайтовыми, поэтому я не могу гарантировать, что это будет работать для Shift JIS. В наши дни я не часто обращаюсь к нему с призывом использовать большинство систем, переключающихся на Unicode.
Вот как вы бы это использовали:
$ ttyconv -rsjis -- tail -f x
Недостатком ttyconv
является то, что я написал это, никто не использует его, кроме меня, вероятно, он полон ошибок. Я преуспеваю в этом. Плюс в том, что он использует libiconv
, поэтому, если ваша кодировка необычна, это ваш лучший выбор. По последним подсчетам, ttyconv --list
поддерживает 100 кодировок.
luit
часть стандартного пакета утилит X11, который похож на вашttyconv
.luit
похож, за исключением того, что он работает намного лучше, чем у меня. ;) Благодарность! Вот почему я перестал использовать в первую очередь. За 12 лет, прошедших с тех пор, как мне удалось забыть даже название команды, я искал его с тех пор.luit
работает для меня тоже. Почему бы вам не сделать это «официальным» ответом? Он был частью моей установки (Debian), и, следовательно, его проще всего использовать для меня.luit
как лучший выбор для SJIS. К сожалению, кажется, что он не поддерживает все кодировкиlibiconv
. Похоже, я все еще должен использовать свое собственное решение для своих сюрреалистических целей. :)Аналогично
ttyconv
есть такжеtconv
, написанный в C Рич Фелкер.Смотрите: Re: вызов для исправления aterm / rxvt / etc ...
источник