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