(візьміть це із щіпкою солі) Наскільки я пам’ятаю, проблема полягає в тому, як це libiconv
працює. Багатобайтним кодуванням потрібна державна машина для їх декодування таlibiconv
вважає за краще отримувати цілі символи, тому ви не можете просто надати їй половину символу в одному виклику функції, а другій половині в наступному.
Я можу придумати ще два рішення: одне - це гарний позадіапазонний метод, інше - вбудований злом.
Зміна кодування термінального емулятора (поза межами діапазону) : одне - змінити кодування символів у вашому емуляторі терміналу, тому його кодованим кодування є Shift JIS. Я щойно перевірив konsole
, чи підтримує це. У меню Виберіть → Кодування символів → Японія → 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
для перекодування терміналу вводу-виводу. Він породжує новий псевдотермінал і (a) перекодує символи, які ви вводите з локального кодування, у віддалене кодування, і (b) перекодує символи, які ви отримуєте з віддаленого кодування, до локального кодування. Я використовував це для розмови з серверами, які використовували кодування, не підтримувані стандартними терміналами Linux. Зверніть увагу, що всі віддалені кодування, з якими я тестував, були однобайтовими кодуваннями, тому я не можу гарантувати, що він буде працювати для Shift JIS. Я не часто зустрічаю дзвінки, щоб використовувати його в наші дні, оскільки більшість систем переходить на Unicode.
Ось як би ви його використовували:
$ ttyconv -rsjis -- tail -f x
Мінус у ttyconv
тому, що я написав це, ніхто не використовує його, окрім мене, він, ймовірно, повний помилок. Я переважаю в цьому. Переваги полягають у тому, що він використовує libiconv
, тому якщо кодування незвичне, це найкраща ставка. При останньому підрахунку ttyconv --list
підтримує 100 кодувань.