preloader
軟體工程

解決寄出信件整體內容或部分資訊,在用戶端顯示是亂碼

近期有機會負責重構產生多語系信件的公司程式碼,這個專案的目標是信件內容資訊區塊模組化,例如歡迎詞、各國聯絡資訊和特殊訊息,可以依照近期可能即將到來的多個專案和重構需求,如積木般排列組合成所需的信件。過程中遇到一個問題是,部分資訊區塊在用戶端呈現是亂碼。

開發使用的程式語言是 PHP 5.x 版本,將現有信件內容的一些資訊區塊改成模板方式產生,使用模版方式之前是能夠正常產生相應語系的信件內容,使用模版方式生成之後,因為資訊區塊模板檔案的儲存方式與主體信件模板不同,資訊區塊模板檔案儲存方式有些是 UTF8 ,有些則是 UTF8 with BOM,但是信件主體模板都是 UTF8 方式儲存,造成資訊區塊呈現是亂碼而主體信件是顯示正常內容。

經過一番排列組合的實驗產生內容

資訊區塊模板/主體信件模板 UTF8 UTF8 with BOM
UTF8 亂碼/正常 亂碼/正常
UTF8 with BOM 亂碼/正常 正常/正常

 

實驗結論

將信件模板 html 檔案、個人化訊息細節模板的 html 檔案以及信件共通資訊 html ,一律存成 UTF8 with BOM ,這樣才不會造成信件內容的整體或是部分內容,從各種收信軟體的用戶端看是亂碼。我認為原因可能是 PHP 5.x 在多位元組 (Multi-bytes)編碼支援程度,可能會因為多讀取到或是少讀取到資訊模板檔案的格式資訊,例如:SomeoneEncoding with BOM 或是 without BOM,導致錯誤解析資訊區塊的檔案編碼,產生亂碼訊息。

我認為這種問題也有可能在以模板方式製作一些內容產生器時發生相同的問題,例如:Line 長輩風格問候圖產生器、罐頭勵志文章產生器和Responsive 設計風格產生器。建議開發人員多注意模板檔案的儲存方式,盡量所有模板檔案統一格式,例如都使用 UTF8 with BOM 。