正 文

用 PHP 解析邮件中的标题、发件人等信息的编码


www.7dspace.com  更新日期:2006-1-9 3:59:40  七度空间


前几天重装了 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 这些编码。


上一篇:利用 PHP 将 HTML 转化为 WML
下一篇:Mozilla 网站设计常见问题
作者:andot  来源:CoolCode.CN ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐