2012
Apr
25
中文亂碼又來了,這是非英文語系工程師最常碰到的問題,最一般為了解決中文亂碼,都會直接裝 email 內容轉成 big5 編碼,我曾經試過硬是使用 UTF-8 編碼,再加上指定編碼方式,不過在 outlook 仍然會出現亂碼,後來我都習慣只要是寄中文信,都會自動轉成 big5 編碼來處理,這次碰到的狀況就更特別了,中文亂碼只會出現在 2046 bytes 的地方,每 2046 bytes 就出會幾個亂碼文字。
亂碼測試
首先建立一個檔案,並在同一行中寫入一堆中文,文字越多越好,最少要超過一千字,並且使用 big5 編碼,記得不要斷行喔,接著再使用 Sendmail command line 的方式,將信件寄送出去。
Example
- [root]$ /usr/sbin/sendmail -t root@localhost < /file
這裡的範例,我直接寄給 root ,所以我只要打開 /var/mail/root ,就能看到寄過來的資料,如果使用 16 進位的方式打開文件,就會發現信件的內容在 2046 bytes 的位置,被切斷,並加了 0a 20 這二個 16 進位的數字,而這二個數字代表的意思是「換行(\n)」。
追查之後發現,sendmail 的 line buff 設定是 2048 bytes ,所以一次讀一行只能讀 2046 個 bytes ,然後 sendmail 會自已加上 2 個 bytes 的換行,最後組成一行為 2048 bytes 的 string,所以如果我們一行的中文字超過 2046 bytes ,中文字就會被切斷,亂碼就重現了!!。
- http://www.sendmail.org/~ca/email/doc8.10.0/RELEASE_NOTES 這是 sendmail 的 package 更新說明,搜尋 2046 後,就可以發現相關的說明。
解決辦法就是,不要一行寫太多中文字,試著斷行吧!
參考資料
- http://www.sendmail.org/~ca/email/doc8.10.0/RELEASE_NOTES
- [Local Mail Transfer Protocol] http://tools.ietf.org/html/rfc2033
Sendmail 測試方式
- 先建立一個檔案,裡面寫入標題,內容。
mail content
- To: xxx@gmail.com
- Subject: test
- Content-Type: text/html;
- From: admin@xxx.com
- Hello, this is a test content
接著下 sendmail 指令送出 mail.
/usr/sbin/sendmail -t xxx@gmail.com < mail