(Nimm das mit einer Prise Salz) Soweit ich mich erinnere, liegt das Problem in der Funktionsweise libiconv
. Multibyte-Codierungen benötigen eine Zustandsmaschine, um sie zu decodieren, und libiconv
bevorzugen den Empfang ganzer Zeichen. Sie können sie also nicht einfach in einem Funktionsaufruf und in der nächsten Hälfte einem halben Zeichen zuweisen.
Ich kann mir zwei andere Lösungen vorstellen, eine ist eine gute Out-of-Band-Methode, die andere ist ein In-Band-Hack.
Ändern der Terminal-Emulator-Codierung (außerhalb des Bandes) : Eine besteht darin, die Zeichencodierung in Ihrem Terminal-Emulator zu ändern, sodass die systemeigene Codierung Shift JIS lautet. Ich habe gerade nachgesehen konsole
und unterstütze dies. Wählen Sie im Menü Ansicht → Zeichenkodierung → Japanisch → sjis. Sie können dann nur tail -f
die Datei und konsole
kümmern sich um die Dekodierung der Multibyte-Zeichen und deren Zuordnung zu Schriftzeichen.
Transcode-Terminal-Codierung im laufenden Betrieb (In-Band; am besten) : Mit freundlicher Genehmigung von Gilles, der mich luit
nach sehr langer Zeit daran erinnert hat . Verwenden Sie luit
, was mit Ihrer XOrg-Distribution hätte kommen sollen (unter Debian ist es das Paket x11-utils
). Benutze es so:
$ luit -encoding SJIS -- tail -f x
Dies veranlasst das Terminal, SJIS von / zu Ihrer Terminalkodierung zu transkodieren und auszuführen tail -f x
. Der Nachteil luit
ist, dass es nicht die Fülle der von unterstützten Codierungen unterstützt libiconv
. Der Vorteil ist, dass es fast überall verfügbar ist.
Transcode-Terminal-Codierung im laufenden Betrieb (In-Band; Hack) : Dies ttyconv
ist ein Hack, den ich vor vielen Jahren geschrieben habe (zunächst in C, später in Python überarbeitet) und mit libiconv
dem Terminal-E / A-Vorgänge transcodiert werden. Es wird ein neues Pseudoterminal erzeugt und (a) die von Ihnen eingegebenen Zeichen aus Ihrer lokalen Codierung in die Ferncodierung umcodiert und (b) die von der Ferncodierung empfangenen Zeichen in Ihre lokale Codierung umcodiert. Ich habe damit mit Servern gesprochen, die Kodierungen verwendeten, die von den Standard-Linux-Terminals nicht unterstützt werden. Bitte beachten Sie, dass alle Remote-Codierungen, mit denen ich es getestet habe, Einzelbyte-Codierungen waren, sodass ich nicht garantieren kann, dass es für Shift JIS funktioniert. Ich finde heutzutage nicht oft einen Anruf, um es zu verwenden, da die meisten Systeme auf Unicode umsteigen.
So würden Sie es verwenden:
$ ttyconv -rsjis -- tail -f x
Der Nachteil ttyconv
ist, dass ich es geschrieben habe, niemand benutzt es außer mir, es ist wahrscheinlich voller Fehler. Darin bin ich herausragend. Der Vorteil ist, dass es verwendet libiconv
wird. Wenn Ihre Codierung also ungewöhnlich ist, ist es die beste Wahl. Bei der letzten Zählung ttyconv --list
werden 100 Codierungen unterstützt.
luit
Teil der Standard-X11-Utility-Suite, der Ihrem ähnlich istttyconv
.luit
ist ähnlich, außer dass es weitaus besser funktioniert als meins. ;) Vielen Dank! Deshalb habe ich aufgehört zu benutzen. In den 12 Jahren seitdem habe ich es geschafft, sogar den Befehlsnamen zu vergessen und seitdem habe ich danach gesucht.luit
funktioniert auch für mich. Warum machst du es nicht zu einer "offiziellen" Antwort? Es war Teil meiner Installation (Debian) und ist daher für mich am einfachsten zu benutzen.luit
die beste Wahl für SJIS ist. Leider scheint es nicht jede Kodierung zulibiconv
unterstützen. Es sieht so aus, als müsste ich meine eigene Lösung für meine eigenen surrealen Zwecke verwenden. :)Ähnlich wie
ttyconv
dort auchtconv
, geschrieben in C von Rich Felker.Siehe: Re: Ein Aufruf zur Fixierung von aterm / rxvt / etc ...
quelle