“tail -f | iconv -fsjis ”não produz nada

14

Eu quero tail -f um arquivo, mas seu conteúdo está em sjis codificação, então preciso convertê-lo para a codificação nativa (utf-8) do meu terminal.

Quando faço

tail -f x | iconv -fsjis

não haverá saída. Como

tail x | iconv -fsjis

funciona, no começo achei que era um problema de buffer, mas tentei unbuffer e stdbuf conforme descrito em Desligue o buffer no tubo não ajudou.

De fato, mesmo depois que mais de 10k de dados foram adicionados ao x, não haveria saída, então eu acho que não é um problema de buffer (buffer é 4k, se não me engano), mas o iconv só iniciar a saída quando recebe um EOF.

Então, como posso seguir meu arquivo sjis codificado?

    
por Eugene Beresovsky 04.04.2012 / 04:18

2 respostas

11

(leve isso com uma pitada de sal) Tanto quanto me lembro, o problema está no modo libiconv funciona. As codificações de múltiplos bytes precisam de uma máquina de estado para decodificá-las, e libiconv prefere receber caracteres inteiros, portanto, você não pode dar apenas meio caractere em uma chamada de função e a outra metade na próxima.

Eu posso pensar em outras duas soluções, uma é um bom método out-of-band, a outra é um hack in-band.

Altere a codificação do emulador de terminal (fora da banda) : uma é alterar a codificação de caracteres no emulador de terminal, portanto, sua codificação nativa é Shift JIS. Acabei de verificar konsole e é compatível com isso. No menu, Exibir → Codificação de caracteres → Japenese → sjis. Você pode então apenas tail -f do arquivo, e konsole irá decodificar os caracteres multibyte e combiná-los com glifos de fonte.

Codificação do terminal de transcodificação em tempo real (in-band; best) : cortesia de Gilles, que me lembrou luit após um longo tempo. Use luit , que deveria vir com a sua distribuição do XOrg (no Debian, é o pacote x11-utils ). Use assim:

$ luit -encoding SJIS -- tail -f x

Isso fará com que o terminal transcreva SJIS de / para sua codificação de terminal e execute tail -f x . A desvantagem de 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 do terminal de transcodificação on the fly (dentro da banda; hack) : ttyconv é um hack Escrevi muitos anos atrás (inicialmente em C, mais tarde refeito em Python) que usa libiconv para transcodificar terminal I / O. Ele gera um novo pseudo-terminal e (a) transcodifica os caracteres que você digita de sua codificação local para a codificação remota e (b) transcodifica os caracteres que você recebe da codificação remota para sua codificação local. Eu usei para falar com servidores que usavam codificações não suportadas pelos terminais Linux padrão. Por favor, note que todas as codificações remotas com as quais testei eram codificações de byte único, então não posso garantir que funcionaria para o Shift JIS. Eu não costumo encontrar chamadas para usá-lo nos dias de hoje, com a maioria dos sistemas mudando para Unicode.

É assim que você o usa:

$ ttyconv -rsjis -- tail -f x

A desvantagem de ttyconv é que eu escrevi, ninguém usa, mas eu, provavelmente está cheio de bugs. Eu sou excelente nisso. A vantagem é que ele usa libiconv , então se sua codificação é incomum, é sua melhor aposta. Na última contagem, ttyconv --list suporta 100 codificações.

    
por 04.04.2012 / 14:05
1

Semelhante a ttyconv , há também tconv , escrito em C por Rich Felker.

Veja: Re: Um convite para a fixação de aterm / rxvt / etc ..

    
por 09.02.2013 / 08:57

Tags