(weź to ze szczyptą soli) O ile pamiętam, problem polega na sposobie libiconv
działania. Kodowanie wielobajtowe wymaga automatu stanów do ich dekodowania i libiconv
woli odbierać całe znaki, więc nie można po prostu nadać mu połowy znaku w jednym wywołaniu funkcji, a drugiej połowy w następnym.
Mogę wymyślić dwa inne rozwiązania, jedno jest dobrą metodą poza pasmem, drugie to hack wewnątrz pasma.
Zmień kodowanie emulatora terminala (poza pasmem) : jednym z nich jest zmiana kodowania znaków w emulatorze terminala, więc jego natywnym kodowaniem jest Shift JIS. Właśnie sprawdziłem konsole
i obsługuje to. Z menu Widok → Kodowanie znaków → Japenese → sjis. Następnie możesz po prostu tail -f
plik i konsole
zajmie się dekodowaniem znaków wielobajtowych i dopasowaniem ich do glifów czcionek.
Kodowanie terminala transkodowanego w locie (w paśmie; najlepsze) : dzięki uprzejmości Gillesa, który przypomniał mi o luit
bardzo długim czasie. Użyj luit
, która powinna była pochodzić z twojej dystrybucji XOrg (na Debianie, jest to pakiet x11-utils
). Użyj tego w ten sposób:
$ luit -encoding SJIS -- tail -f x
Spowoduje to, że terminal przekoduje SJIS do / z twojego terminala i uruchomi się tail -f x
. Minusem luit
jest to, że nie obsługuje bogactwa kodowania obsługiwanego przez libiconv
. Plusem jest to, że jest dostępny prawie wszędzie.
Kodowanie terminala transkodowanego w locie (wewnątrz pasma; hack) : ttyconv
to hack, który napisałem wiele lat temu (początkowo w C, a później przerobiony w Pythonie), który wykorzystuje libiconv
do transkodowania I / O terminala. Odradza się nowy pseudoterminal i (a) transkoduje znaki, które wpisujesz z lokalnego kodowania na kodowanie zdalne, i (b) transkoduje znaki, które otrzymujesz z kodowania zdalnego na kodowanie lokalne. Użyłem go do rozmowy z serwerami, które używały kodowania nieobsługiwanego przez standardowe terminale Linuksa. Pamiętaj, że wszystkie zdalne kodowania, z którymi go testowałem, były kodowaniami jednobajtowymi, więc nie mogę zagwarantować, że zadziała w Shift JIS. Obecnie często nie znajduję połączenia, aby z niego korzystać, ponieważ większość systemów przełącza się na Unicode.
Tak byś tego użył:
$ ttyconv -rsjis -- tail -f x
Minusem ttyconv
jest to, że to napisałem, nikt tego nie używa, ale ja, prawdopodobnie jest pełen błędów. Celuję w tym. Zaletą jest to, że używa libiconv
, więc jeśli twoje kodowanie jest nietypowe, jest to najlepszy wybór. W ostatniej liczbie ttyconv --list
obsługuje 100 kodowań.