PHP中文字符IMAP

时间:2011-11-06 10:52:07

标签: php imap cjk

我通过IMAP从电子邮件中检索数据,我想要  检测(通过PHP)身体是否具有中文,日文或韩文字符编程。我知道编码但不能检测

    $mbox = imap_open ("{localhost:995/pop3/ssl/novalidate-cert}",  "info@***.com", "********");

    $email=$_REQUEST['email'];

    $num_mensaje = imap_search($mbox,"FROM $email");

    // grab the body for the same message
        $body =  imap_fetchbody($mbox,$num_mensaje[0],"1");

            //chinese for example
        $str = mb_convert_encoding($body,"UTF-8","EUC-CN");

    imap_close($mbox);

任何想法

1 个答案:

答案 0 :(得分:2)

  • 您的意思是您不知道传入消息的CJK编码是什么吗?

查找该信息的规范位置是charset=标题中的Content-Type:参数。

不幸的是,提取它并不像你希望的那样简单。你真的认为imap_header返回的对象会包含类型信息,但事实并非如此。相反,您必须使用imap_fetchheader从邮件中获取原始标头,并自行解析它们。

解析RFC822标头并不是完全简单的。对于简单的情况,您可以通过匹配^content-type:.*; *charset=([^;]+)(不区分大小写)来匹配每一行。但要真正做到这一点,尽管你必须通过适当的RFC822系列解析器(如MailParse)运行整个消息头和正文。

然后你仍然遇到了忽略包含charset信息的消息问题。对于这种情况,您需要使用mb_detect_encoding

  • 或者您只是担心正确解码的字符代表哪种语言?

在这种情况下,您想要使用与上面相同的方法阅读的标题是Content-Language。然而,它经常不存在,在这种情况下,你不得不再次猜测。 CJK统一意味着所有语言都可以使用许多相同的字符,但您可以使用一些启发式来猜测:

  1. 消息所在的编码,来自上面。例如,如果它是EUC-CN,你的语言可能会简化为中文。

  2. 文本中存在任何假名(U + 3040-U + 30FF - >日语)或韩文(U + AC00-U + D7FF - >韩文)。

  3. 简体中文与繁体中文字符的存在。虽然某些角色可以代表其中任何一个,但其他角色(两个变体之间的笔画有明显变化)只能代表一个。检测其存在的简单方法是尝试将字符串编码为GBK和Big5编码,并查看它是否失败。即如果你不能编码为GBK但你可以编译为Big5,它将是繁体中文。