(возьмите это с щепоткой соли) Насколько я помню, проблема заключается в том, как 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 кодировок.