
Tengo archivos de texto codificado ISO-8859 que los clientes me envían periódicamente y que contienen información de depuración.
Recientemente, comenzaron a aparecer en mi bandeja de entrada como ASCII codificado con algunos caracteres adicionales en el archivo como resultado, rompiendo el analizador que escribí para estos archivos.
Lo limité al cliente de correo electrónico que utiliza el cliente y que cambia la codificación.
¿Es posible revertir este falso cambio de codificación?
Como trabajo con Linux, preferiría una solución para Linux, pero también estaría interesado en soluciones para otros sistemas operativos.
Aquí hay algunos resultados para referencia e información:
$ 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
Ejemplos de contenido (la información es diferente, la estructuradeberíaser el mismo pero incorrecto_enc.txt tiene caracteres adicionales detrás de '=" y en EOL, por ejemplo):
$ 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 =
Respuesta1
La codificación mostrada esCitado-imprimible, y es completamente normal verlo si está viendo el texto fuente de un correo electrónico "sin procesar": la mayoría de los mensajes y archivos adjuntos de texto que no son ASCII, e incluso algunos puramente ASCII, están codificados usando QP (o incluso Base64).
Si el cliente de correo emisor indicó correctamente su uso en elCodificación de transferencia de contenidoencabezado, el cliente de correo receptor decodificará automáticamente QP en texto normal. (Si el encabezado MIME es correcto pero su cliente de correo no realiza esta decodificación, entonces es su cliente de correo el que está roto, no el del cliente).
Si necesita realizar la decodificación usted mismo, existen varias bibliotecas para ello:
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
Mientras tudeberíaUtilice el módulo existente, es relativamente sencillo decodificar QP directamente:
perl -0777 -pe 's/=\n//gs; s/=([0-9A-F]{2})/pack("C", hex($1))/gse' < wrong.txt > fixed.txt
=
seguido de una nueva línea se elimina (las líneas se unen);=
seguido de dos dígitos hexadecimales se reemplaza por el byte correspondiente.