(prendilo con un pizzico di sale) Per quanto mi ricordo, il problema sta nel modo in cui libiconv
funziona. Le codifiche multi-byte hanno bisogno di una macchina a stati per decodificarle e libiconv
preferiscono ricevere interi caratteri, quindi non puoi dargli solo metà carattere in una chiamata di funzione e l'altra metà nella successiva.
Mi vengono in mente altre due soluzioni, una è un buon metodo fuori banda, l'altra è un hack in banda.
Modifica codifica dell'emulatore terminale (fuori banda) : si deve cambiare la codifica dei caratteri nell'emulatore terminale, quindi la sua codifica nativa è Shift JIS. Ho appena controllato konsole
e supporta questo. Dal menu Visualizza → Codifica caratteri → Giapponese → sjis. È quindi possibile solo tail -f
il file e konsole
si occuperà di decodificare i caratteri multibyte e abbinarli a glifi dei caratteri.
Codifica terminale transcodifica al volo (in banda; migliore) : per gentile concessione di Gilles, che mi ha ricordato luit
dopo molto tempo. Usa luit
, che avrebbe dovuto venire con la tua distribuzione XOrg (su Debian, è un pacchetto x11-utils
). Usalo in questo modo:
$ luit -encoding SJIS -- tail -f x
Ciò renderà il terminale transcodificare SJIS da / verso la codifica del terminale ed eseguirà tail -f x
. Il rovescio della medaglia di luit
è che non supporta la ricchezza di codifiche supportate da libiconv
. Il lato positivo è che è disponibile quasi ovunque.
Transcodifica al volo del terminale (in-band; hack) : ttyconv
è un trucco che ho scritto molti anni fa (inizialmente in C, poi rifatto in Python) che usa libiconv
per transcodificare l'I / O del terminale. Genera un nuovo pseudoterminale e (a) transcodifica i caratteri digitati dalla codifica locale nella codifica remota e (b) transcodifica i caratteri ricevuti dalla codifica remota nella codifica locale. L'ho usato per parlare con server che utilizzavano codifiche non supportate dai terminali Linux standard. Si noti che tutte le codifiche remote con cui l'ho testato erano codifiche a byte singolo, quindi non posso garantire che funzioni per Shift JIS. Non trovo spesso chiamate per usarlo in questi giorni, con la maggior parte dei sistemi che passano a Unicode.
Ecco come lo useresti:
$ ttyconv -rsjis -- tail -f x
Il rovescio della medaglia ttyconv
è che l'ho scritto, nessuno lo usa tranne me, è probabilmente pieno di bug. Eccello in questo. Il lato positivo è che utilizza libiconv
, quindi se la tua codifica è insolita, è la soluzione migliore. All'ultimo conteggio, ttyconv --list
supporta 100 codifiche.