(leve isso com uma pitada de sal) Até onde me lembro, o problema está no modo como libiconv
funciona. As codificações de vários bytes precisam de uma máquina de estado para decodificá-las e libiconv
preferem receber caracteres inteiros; portanto, você não pode atribuir apenas meio caractere em uma chamada de função e a outra metade na seguinte.
Posso pensar em outras duas soluções, uma é um bom método fora da banda, a outra é um hack na banda.
Alterar a codificação do Terminal Emulator (fora da banda) : uma é alterar a codificação de caracteres no emulador de terminal, para que sua codificação nativa seja Shift JIS. Acabei de verificar konsole
, e é suporta isso. No menu, Exibir → Codificação de caracteres → Japonês → sjis. Você pode então apenas tail -f
o arquivo e konsole
cuidará da decodificação dos caracteres multibyte e da correspondência deles com os glifos da fonte.
Codificação de terminal de transcodificação em tempo real (dentro da banda; melhor) : cortesia de Gilles, que me lembrou luit
depois de muito tempo. Use luit
, que deveria ter vindo com sua distribuição XOrg (no Debian, é pacote x11-utils
). Use-o assim:
$ luit -encoding SJIS -- tail -f x
Isso fará com que o terminal transcodifique o SJIS de / para a codificação do terminal e execute tail -f x
. A desvantagem luit
é que ele não suporta a riqueza de codificações suportadas por libiconv
. A vantagem é que está disponível em quase todos os lugares.
Codificação de terminal de transcodificação em tempo real (dentro da banda; hack) : ttyconv
é um hack que escrevi há muitos anos (inicialmente em C, posteriormente refeito em Python) que é usado libiconv
para transcodificar a E / S do terminal. Ele gera um novo pseudoterminal e (a) transcodifica os caracteres digitados da codificação local para a codificação remota e (b) transcodifica os caracteres que você recebe da codificação remota para a codificação local. Usei-o para conversar com servidores que usavam codificações não suportadas pelos terminais padrão do Linux. Observe que todas as codificações remotas com as quais eu testei eram de byte único, portanto não posso garantir que funcione para o Shift JIS. Não costumo encontrar chamadas para usá-lo atualmente, com a maioria dos sistemas alternando para Unicode.
É assim que você o usaria:
$ ttyconv -rsjis -- tail -f x
A desvantagem ttyconv
é que eu escrevi, ninguém usa, exceto eu, provavelmente está cheio de bugs. Eu me supero nisso. O lado positivo é que ele usa libiconv
, portanto, se sua codificação é incomum, é sua melhor aposta. Na última contagem, ttyconv --list
suporta 100 codificações.