
我有客戶定期發送給我的 ISO-8859 編碼文字文件,其中包含偵錯資訊。
最近,它們開始以 ASCII 編碼形式出現在我的收件匣中,結果在文件中添加了一些額外的字符,破壞了我為這些文件編寫的解析器。
我將範圍縮小到客戶使用的更改編碼的電子郵件用戶端。
是否可以恢復這種錯誤的編碼變更?
因為我使用的是 Linux,所以我更喜歡 Linux 的解決方案,但也對其他作業系統的解決方案感興趣。
以下是一些供參考和資訊的輸出:
$ 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
內容範例(資訊不同,結構應該相同,但錯誤的_enc.txt 在“=”後面和 EOL 處有附加字符,例如):
$ 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 =
答案1
顯示的編碼是引用-可列印,並且如果您正在查看「原始」電子郵件來源文本,這是完全正常的 – 大多數非 ASCII 訊息和文字附件,甚至一些純 ASCII 訊息和文字附件,都是使用 QP(甚至 Base64)編碼的。
如果發送郵件用戶端在內容傳輸編碼頭,那麼接收郵件用戶端將自動將 QP 解碼為普通文字。 (如果 MIME 標頭正確,但您的郵件用戶端不執行此解碼,則損壞的是您的郵件用戶端,而不是客戶的。)
如果您需要自己執行解碼,可以使用各種函式庫:
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
當你應該使用現有的模組,直接解碼QP比較簡單:
perl -0777 -pe 's/=\n//gs; s/=([0-9A-F]{2})/pack("C", hex($1))/gse' < wrong.txt > fixed.txt
=
隨後的換行符號被刪除(行連接在一起);=
後面的兩個十六進制數字被替換為相應的位元組。