Corrigir/reverter codificação errada do arquivo

Corrigir/reverter codificação errada do arquivo

Tenho arquivos de texto codificado ISO-8859 enviados regularmente por clientes que contêm informações de depuração.
Recentemente, eles começaram a aparecer na minha caixa de entrada como codificados em ASCII, com alguns caracteres extras no arquivo, quebrando o analisador que escrevi para esses arquivos.
Eu reduzi ao cliente de e-mail usado pelo cliente que altera a codificação.

É possível reverter esta falsa mudança de codificação?
Como trabalho com Linux, preferiria uma solução para Linux, mas também estaria interessado em soluções para outros sistemas operacionais.

Aqui estão alguns resultados para referência e informações:

$ file /tmp/{wrong,right}_enc.txt
/tmp/wrong_enc.txt: ASCII text
/tmp/right_enc.txt: ISO-8859 text, with very long lines, with CRLF line terminators

$ file -bi /tmp/{wrong,right}_enc.txt
text/plain; charset=us-ascii
text/plain; charset=iso-8859-1

Exemplos de conteúdo (as informações são diferentes, a estruturadeveseja o mesmo, mas errado_enc.txt possui caracteres adicionais atrás de '=' e no EOL, por exemplo):

$ head /tmp/{wrong,right}_enc.txt
==> /tmp/wrong_enc.txt <==
Tue Jun 11 15:51:54 2019=0D
=0D
=0D
###Eth-eth0-driver =3D igb=0D
###Eth-eth0-ipaddr =3D 192.168.99.100=0D
###Eth-eth0-link =3D yes=0D
###Eth-eth1-driver =3D e1000e=0D
###Eth-eth1-ipaddr =3D =0D
###Eth-eth1-link =3D no=0D

==> /tmp/right_enc.txt <==
Wed Apr 17 16:47:21 2019


###Eth-eth0-driver = e1000e
###Eth-eth0-ipaddr = 192.168.178.35
###Eth-eth0-link = yes
###Eth-ethnames = eth0
###Eth-ethtool-eth0 =

Responder1

A codificação mostrada éCitado para impressão, e é completamente normal ver se você está olhando para o texto de origem do e-mail "bruto" - a maioria das mensagens e anexos de texto não ASCII, e até mesmo alguns puramente ASCII, são codificados usando QP (ou mesmo Base64).

Se o cliente de envio de email indicou corretamente seu uso noCodificação de transferência de conteúdocabeçalho, o cliente de e-mail receptor decodificará automaticamente o QP em texto normal. (Se o cabeçalho MIME estiver correto, mas o seu cliente de e-mail não executar essa decodificação, então é o seu cliente de e-mail que está quebrado, não o do cliente.)

Se você mesmo precisar realizar a decodificação, existem várias bibliotecas para isso:

ruby -e 'print STDIN.read.unpack("M")[0]' < wrong.txt > fixed.txt
perl -0777 -ne 'use MIME::QuotedPrint; print decode_qp($_)' < wrong.txt > fixed.txt

Enquanto vocêdeveuse o módulo existente, é relativamente simples decodificar QP diretamente:

perl -0777 -pe 's/=\n//gs; s/=([0-9A-F]{2})/pack("C", hex($1))/gse' < wrong.txt > fixed.txt
  1. =seguido por nova linha é removido (linhas unidas);
  2. =seguido por dois dígitos hexadecimais é substituído pelo byte correspondente.

informação relacionada