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)