Posts Tagged ‘encoding’

源代码的字符集不同带来的问题

Sunday, March 29th, 2009

这两天在研究 Jobs Digg 的中文 URL 编码乱码的问题,我发现原来是由源代码字符集和数据输入输出字符集不同造成的。

这个乱码问题是这样的。在 Jobs Digg 的网站上,中文分类的链接里 URL 编码出错,无法还原成原来的中文名称。比如,UTF-8 的“招聘”这两个中文的 URL 编码应该是 %E6%8B%9B%E8%81%98,而出错的串变成 ae%8B%9Be%81%98。

产生这个问题的原因是在添加/更新分类的时候,Pligg 会把这个分类名称另外保存成一个 category_safe_name,代码中是先用 str_replace 函数把分类名称中可能包含的特殊字符转换成安全字符,再进行 URLEncode。

(more…)

邮件中文问题

Monday, October 13th, 2008

我们经常发送中文的电子邮件,而电子邮件的编码写web不大一样。我们一般用base64的编码来处理邮件头中非ascii字符。而现在UTF-8是web上最通用的编码。

$smtp->datasend("Content-Type:text/plain;charset=UTF-8\n"); #这里设置邮件内容的编码
$smtp->datasend("Subject:=?UTF-8?B?".encode_base64($title, '')."?=\n\n"); #encode_base64是MIME::Base64模块中的函数,$title为UTF-8编码过的
$smtp->datasend($mail_body." \n"); #$mail_body为UTF-8编码过的

其中=?UTF-8?B?为前缀,?=为后缀,B表示Base64编码。在邮件头的标题中,必须先用utf-8编码,然后再用base64编码,而邮件体就可以直接采用UTF-8的编码。
这样发出的邮件,就不会出现中文乱码的问题。

(more…)