
Ich habe regelmäßig von Kunden ISO-8859-kodierte Textdateien erhalten, die Debuginformationen enthalten.
Seit Kurzem sind sie in meinem Posteingang als ASCII-kodierte Dateien mit ein paar zusätzlichen Zeichen in der Datei aufgetaucht, wodurch der Parser, den ich für diese Dateien geschrieben habe, nicht mehr funktioniert.
Ich habe es auf den vom Kunden verwendeten E-Mail-Client eingegrenzt, der die Kodierung ändert.
Ist es möglich, diese falsche Kodierungsänderung rückgängig zu machen?
Da ich mit Linux arbeite, bevorzuge ich eine Lösung für Linux, wäre aber auch an Lösungen für andere Betriebssysteme interessiert.
Hier einige Ausgaben zu Referenz- und Informationszwecken:
$ 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
Inhaltsbeispiele (Info ist anders, Struktursollengleich sein, aber wrong_enc.txt hat zusätzliche Zeichen hinter '=' und bei EOL zum Beispiel):
$ 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 =
Antwort1
Die gezeigte Kodierung istZitiert-Druckbar, und es ist völlig normal, dies zu sehen, wenn Sie sich den „rohen“ Quelltext einer E-Mail ansehen – die meisten Nicht-ASCII-Nachrichten und Textanhänge und sogar einige reine ASCII-Nachrichten werden mit QP (oder sogar Base64) codiert.
Wenn der sendende Mail-Client seine Nutzung korrekt imInhaltsübertragungskodierungHeader, dann dekodiert der empfangende Mail-Client QP automatisch in normalen Text. (Wenn der MIME-Header korrekt ist, Ihr Mail-Client diese Dekodierung jedoch nicht durchführt, liegt das Problem bei Ihrem Mail-Client und nicht beim Kunden.)
Wenn Sie die Dekodierung selbst durchführen müssen, stehen Ihnen dafür verschiedene Bibliotheken zur Verfügung:
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
Während dusollenVerwenden Sie das vorhandene Modul. Es ist relativ einfach, QP direkt zu dekodieren:
perl -0777 -pe 's/=\n//gs; s/=([0-9A-F]{2})/pack("C", hex($1))/gse' < wrong.txt > fixed.txt
=
gefolgt von Newline wird entfernt (Zeilen zusammengefügt);=
gefolgt von zwei Hexadezimalziffern wird durch das entsprechende Byte ersetzt.