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: [email protected]
- Subject: test
- Content-Type: text/html;
- From: [email protected]
- Hello, this is a test content
接著下 sendmail 指令送出 mail.
/usr/sbin/sendmail -t [email protected] < mail
回應 (Leave a comment)