(prenez ceci avec une pincée de sel) Pour autant que je m'en souvienne, le problème réside dans le libiconv
fonctionnement. Les codages multi-octets ont besoin d'une machine d'état pour les décoder et libiconv
préfèrent recevoir des caractères entiers, vous ne pouvez donc pas simplement lui donner la moitié d'un caractère dans un appel de fonction et l'autre moitié dans le suivant.
Je peux penser à deux autres solutions, l'une est une bonne méthode hors bande, l'autre est un hack intrabande.
Changer l'encodage de l'émulateur de terminal (hors bande) : l'un consiste à changer l'encodage des caractères dans votre émulateur de terminal, de sorte que son encodage natif est Shift JIS. Je viens de vérifier konsole
, et prend en charge cela. Dans le menu, Affichage → Encodage des caractères → Japonais → sjis. Vous pouvez alors juste tail -f
le fichier, et vous konsole
occuperez de décoder les caractères multi-octets et de les faire correspondre aux glyphes de police.
Transcode le codage du terminal à la volée (dans la bande; le meilleur) : gracieuseté de Gilles, qui me l'a rappelé luit
après très longtemps. Use luit
, qui aurait dû accompagner votre distribution XOrg (sur Debian, c'est le paquet x11-utils
). Utilisez-le comme ceci:
$ luit -encoding SJIS -- tail -f x
Cela fera que le terminal transcodera SJIS vers / depuis votre encodage de terminal et s'exécutera tail -f x
. L'inconvénient luit
est qu'il ne prend pas en charge la richesse des encodages pris en charge par libiconv
. L'avantage est qu'il est disponible presque partout.
Transcodage du codage du terminal à la volée (dans la bande; piratage) : ttyconv
est un piratage que j'ai écrit il y a de nombreuses années (initialement en C, puis refait en Python) qui utilise libiconv
pour transcoder les E / S du terminal. Il engendre un nouveau pseudoterminal et (a) transcode les caractères que vous tapez de votre encodage local en encodage distant, et (b) transcode les caractères que vous recevez de l'encodage distant en votre encodage local. Je l'ai utilisé pour parler à des serveurs qui utilisaient des encodages non pris en charge par les terminaux Linux standard. Veuillez noter que tous les encodages à distance avec lesquels je l'ai testé étaient des encodages à un octet, donc je ne peux pas garantir que cela fonctionnerait pour Shift JIS. Je ne trouve pas souvent d'appel pour l'utiliser de nos jours, avec la plupart des systèmes passant à Unicode.
Voici comment vous l'utiliseriez:
$ ttyconv -rsjis -- tail -f x
L'inconvénient ttyconv
est que je l'ai écrit, personne ne l'utilise mais moi, c'est probablement plein de bugs. J'excelle dans ce domaine. L'avantage est qu'il utilise libiconv
, donc si votre encodage est inhabituel, c'est votre meilleur pari. Au dernier décompte, ttyconv --list
prend en charge 100 encodages.