修復/恢復錯誤的檔案編碼

修復/恢復錯誤的檔案編碼

我有客戶定期發送給我的 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
  1. =隨後的換行符號被刪除(行連接在一起);
  2. =後面的兩個十六進制數字被替換為相應的位元組。

相關內容