前几天重装了 IIS,发现原来的 WAP 网站成乱码了。原来的 IIS 会自动将 WAP 页面中的 GB2312 编码转化为 UTF-8 的编码,而重装以后就不能自动转化了,没找到原因,所以只好把所有的页面都改成了 UTF-8 的。但是在修改 WAP 邮件系统时发现,原来的邮件标题、收件人等信息解析就不是很正确。经过这次修改终于好用了。
在PHP手册中有一个 imap_mime_header_decode 函数,但是它并不能总是正常工作,例如下面这个通过它来解析的函数:
1. <?php
2. function ParseEncode($data) {
3. $elements = imap_mime_header_decode($data);
4. $text = "";
5. for ($i=0; $i<count($elements); $i++) {
6. $text .= iconv($elements[$i]->charset, "UTF-8", $elements[$i]->text);
7. }
8. return $text;
9. }
10. ?>
对于没有经过编码的标题,经过上面这个函数一解析,就成空的了。还有一些编码它也不能正确地识别。所以我编写了下面这段解析代码,它可以很好的工作。
下载: ParseEncode.php
1. <?php
2.
3. # /**
4. # * @author 马秉尧
5. # * @copyright 2005 CoolCode.CN
6. # */
7.
8. function ParseEncode($data, $encode="ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1") {
9. $data = mb_convert_encoding($data, "UTF-8", $encode);
10. $data = preg_replace_callback("/(=\?(.*?)\?B\?(.*?)\?=)/i",
11. create_function('$matches', 'return mb_convert_encoding(imap_base64($matches[3]), "UTF-8", $matches[2]);'),
12. $data);
13. $data = preg_replace_callback("/(=\?(.*?)\?Q\?(.*?)\?=)/i",
14. create_function('$matches', 'return mb_convert_encoding(imap_qprint($matches[3]), "UTF-8", $matches[2]);'),
15. $data);
16. return $data;
17. }
18.
19. ?>
邮件的编码一般可以从邮件头中获得:
MIME-Version: 1.0
Content-Type: tex class=codet/plain;
charset=gb2312
其中,charset=gb2312 这里指明了邮件编码。
在PHP手册的 IMAP, POP3 and NNTP Functions 这一章中,我一直没有找到能够获得这个编码的函数。所以我默认指定了 ucs-bom,utf-8,cp936,big5,euc-jp,euc-kr,latin1 这些编码。
