首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP汉字IMAP

PHP汉字IMAP
EN

Stack Overflow用户
提问于 2011-11-06 10:52:07
回答 1查看 750关注 0票数 0

我通过IMAP从电子邮件中检索数据,并希望(通过PHP)通过编程方式检测身体是否有中文、日文或韩文字符。我知道编码,但不知道

代码语言:javascript
复制
    $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);

任何想法

EN

回答 1

Stack Overflow用户

发布于 2011-11-06 11:37:12

  • 您的意思是您不知道编码传入消息的是哪个CJK?

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

不幸的是,提取这一点并不像你希望的那样简单。实际上,您可能认为imap_header返回的对象将包含类型信息,但它不包含,相反,您必须使用imap_fetchheader从消息中获取原始标头,并自己解析它们。

解析RFC822头并不是完全简单的。对于简单的情况,您可以通过将每一行与^content-type:.*; *charset=([^;]+)匹配(case-不敏感)来避免。但是,要真正正确地执行它,您必须通过一个适当的run 822家庭解析器(如MailParse )来运行整个消息头和正文。

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

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

在本例中,您希望使用与上面相同的方法读取的头是Content-Language。然而,它常常不存在,在这种情况下,你不得不再次回到猜测。CJK统一意味着所有语言都可能使用许多相同的字符,但是有几种启发式方法可以用来猜测:

  1. 消息所使用的编码,来自上述内容。如果是EUC,你的语言很可能是简体中文。
  2. 任何kana (U+3040-U+30 of ->日文)或汉格尔(U+ in 00-U+D7FF ->朝鲜语)在文本中的存在。
  3. 简体与繁体汉字的存在。虽然有些字符可以表示任何一种,但另一些字符(两个变体之间的笔画有重大变化)只适合一个字符。检测它们存在的简单方法是尝试将字符串编码为GBK和Big5编码,并查看它是否失败。如果你不能编码到GBK,但你可以Big5,它将是繁体中文。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8026548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档