Eu tenho arquivos de texto codificado em ISO-8859 enviados a mim regularmente por clientes que contêm informações de depuração.
Recentemente, eles começaram a aparecer na minha caixa de entrada como ASCII codificado com alguns caracteres extras no arquivo como resultado, quebrando o analisador que escrevi para esses arquivos.
Limitei-o ao cliente de e-mail usado pelo cliente que altera a codificação.
É possível reverter essa falsa mudança de codificação?
Como estou trabalhando com Linux, prefiro uma solução para Linux, mas também estaria interessado em soluções para outros sistemas operacionais.
Aqui estão algumas saídas 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 estrutura deve ser a mesma, mas o arquivo wrong_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 =
A codificação mostrada é Quoted-Printable , e é completamente normal para ver se você está olhando para texto de origem de e-mail "bruto" - a maioria das mensagens não ASCII e anexos de texto, e até mesmo alguns puramente ASCII, são codificados usando QP (ou mesmo Base64).
Se o cliente de email de envio indicou corretamente seu uso no cabeçalho Content-Transfer-Encoding , o cliente de email de recebimento decodificará QP automaticamente em texto normal. (Se o cabeçalho MIME estiver correto, mas seu cliente de e-mail não executar essa decodificaçã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:
Embora você deva usar o módulo existente, é relativamente simples decodificar o QP diretamente:
=
seguido por nova linha é removido (linhas unidas);=
seguido por dois dígitos hexadecimais é substituído pelo byte correspondente.