【问题标题】:PHP chinese character IMAPPHP汉字IMAP
【发布时间】:2011-12-23 00:23:23
【问题描述】:

我通过 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);

任何想法

【问题讨论】:

标签: php imap cjk


【解决方案1】:
  • 你的意思是你不知道传入的消息是哪个 CJK 编码的?

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

不幸的是,提取它并不像您希望的那样简单。你真的会认为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,那就是繁体中文。

【讨论】:

  • 但如果是 UTF-8 中的中文或韩文字符呢?
  • 是的,那么您必须按照 (2) 和 (3) 进行猜测。这不是很好,但是与电子邮件处理有关的几乎所有事情都是不可靠且过于复杂的。
  • 是的。我不太确定 OP 首先想要什么 - 他们可能正在寻找检测编码而不是 characters
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
相关资源
最近更新 更多