偶爾在 Outlook 會收到中文亂碼信,產生亂碼多半是用傳送過程某次或多次字串/二進位轉換用錯編碼,例如:用繁體中文 BIG5 去解 UTF-8,用簡體中文 GB2312 去解 BIG5 ... 等。

有些亂碼無法逆轉,有些則可透過一點小技巧還原出原文。無法逆轉案例像是用 BIG5 解析 Unicode 文字,因 BIG5 字數較少,對映不到字元時便會產生問號或 ¿ 符號,從而生出"蕞蕞蕞蕞"之類的亂碼;都變成問號了,想當然爾就不可能再反推它原本是什麼字元。另外還有用 UTF8 解 BIG5 再用 UTF8 解一次的 嚙踝蕭亂、簡體中文轉換常見的「手持兩把錕斤拷,口中疾呼燙燙燙。 腳踏千朵屯屯屯,笑看萬物鍩鍩鍩。」,其共同特徵是會重複相同的亂碼,一般就屬於不可逆的狀況,神仙難救。

但像下面這類案例比較不一樣,它沒有反覆出現相同的亂碼片段,也沒有太多問號,通常就代表還有救。依經驗多是 BIG5 被當成 GB2312,因為 GB2312 與 BIG5 的字碼區重疊性高,不太會變成問號,只是 A 字對映成 B 字,這種情況只需簡單轉換多半能還原出原文。

先用一個簡單測試證明這是 BIG5 被當成 GB2312 造成。亂碼信的主旨通常是正常中文,且主旨文字一般也會在內文出現,因此我們可以把主旨跟內文片段貼到線上中文編碼解析工具進行分析:

如上圖所示,「公」的 BIG5 編碼 A4 BD 與 「そ」的 GB2312 編碼 A4 BD 相同,這不是巧合,基本上就是 BIG5 被解讀成 GB2312 的徵兆。

確認編碼錯亂原因,我們只需寫幾行 PowerShell 就能還原出原文:

$s = @"
そガら2012/12/15 
钡琌ソらㄓ羬セいみ盢氨ゎ矗ㄑ兜戈癟╰参狝叭ㄢぱ絋粄妮店佩︽確 
既氨丁2012/12/20 いと 12  2012/12/22 いと 12  
硑Θぃ獽穛叫ǎ教 
狠мいみ 穛 
"@
$binary = [System.Text.Encoding]::GetEncoding('gb2312').GetBytes($s)
$decoded = [System.Text.Encoding]::GetEncoding('big5').GetString($binary)
Write-Host $decoded

成功!

This article introduces common types of Chinese garbled text and demonstrates how to use PowerShell to restore the original text from incorrectly converted GB2312/BIG5 garbled text.


Comments

# by Kayson

太強大了

Post a comment