«Queue -f | iconv -fsjis "ne produit rien

14

Je veux tail -fun fichier, mais son contenu est en sjisencodage, j'ai donc besoin de le convertir en encodage natif (utf-8) de mon terminal.

Quand je fais

queue -fx | iconv -fsjis

il n'y aura pas de sortie. Comme

queue x | iconv -fsjis

fonctionne, au début, je pensais que c'était un problème de mise en mémoire tampon, mais essayer unbufferet stdbufcomme décrit sur Désactiver la mise en mémoire tampon dans le tuyau n'a pas aidé.

En fait, même après que plus de 10 000 données ont été ajoutées à x, il n'y aurait pas de sortie, donc je suppose que ce n'est pas un problème de mise en mémoire tampon (la mémoire tampon est de 4 Ko, si je ne me trompe pas), mais iconv ne commencera à sortir que lorsque il reçoit un EOF.

Alors, comment puis-je suivre mon fichier encodé sjis?

Eugene Beresovsky
la source

Réponses:

11

(prenez ceci avec une pincée de sel) Pour autant que je m'en souvienne, le problème réside dans le libiconvfonctionnement. Les codages multi-octets ont besoin d'une machine d'état pour les décoder et libiconvpré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 -fle fichier, et vous konsoleoccuperez 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é luitaprè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 luitest 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) : ttyconvest un piratage que j'ai écrit il y a de nombreuses années (initialement en C, puis refait en Python) qui utilise libiconvpour 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 ttyconvest 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 --listprend en charge 100 encodages.

Alexios
la source
Génial merci. out-of-band n'a pas fonctionné pour moi (gnome-terminal, bien qu'il vous permette de changer l'encodage), mais ttyconv fonctionne comme un charme.
Eugene Beresovsky
2
De nos jours, il existe une luitpartie de la suite d'utilitaires X11 standard, qui est similaire à la vôtre ttyconv.
Gilles 'SO- arrête d'être méchant'
@Gilles luitest similaire, sauf qu'il fonctionne bien mieux que le mien. ;) Merci! C'est pourquoi j'ai cessé d'utiliser en premier lieu. Depuis 12 ans, j'ai réussi à oublier même le nom de la commande et je le cherche depuis.
Alexios
@Gilles luitfonctionne aussi pour moi. Pourquoi n'en faites-vous pas une réponse «officielle»? Cela faisait partie de mon installation (debian), et c'est donc la plus facile à utiliser pour moi.
Eugene Beresovsky
1
J'ai mis à jour la réponse pour l'inclure luitcomme le meilleur choix pour SJIS. Malheureusement, il semble qu'il ne supporte pas tous les encodages libiconv. On dirait que je dois encore utiliser ma propre solution à mes propres fins surréalistes. :)
Alexios