2012
Apr
25

中文亂碼又來了,這是非英文語系工程師最常碰到的問題,最一般為了解決中文亂碼,都會直接裝 email 內容轉成 big5 編碼,我曾經試過硬是使用 UTF-8 編碼,再加上指定編碼方式,不過在 outlook 仍然會出現亂碼,後來我都習慣只要是寄中文信,都會自動轉成 big5 編碼來處理,這次碰到的狀況就更特別了,中文亂碼只會出現在 2046 bytes 的地方,每 2046 bytes 就出會幾個亂碼文字。

亂碼測試

首先建立一個檔案,並在同一行中寫入一堆中文,文字越多越好,最少要超過一千字,並且使用 big5 編碼,記得不要斷行喔,接著再使用 Sendmail command line 的方式,將信件寄送出去。

Example
  1. [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 ,中文字就會被切斷,亂碼就重現了!!。

解決辦法就是,不要一行寫太多中文字,試著斷行吧!

參考資料

Sendmail 測試方式

  • 先建立一個檔案,裡面寫入標題,內容。
mail content
  1. To: [email protected]
  2. Subject: test
  3. Content-Type: text/html;
  4. From: [email protected]
  5.  
  6. Hello, this is a test content

接著下 sendmail 指令送出 mail.

/usr/sbin/sendmail -t [email protected] < mail

回應 (Leave a comment)