我通过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);
任何想法
答案 0 :(得分:2)
查找该信息的规范位置是charset=
标题中的Content-Type:
参数。
不幸的是,提取它并不像你希望的那样简单。你真的认为imap_header
返回的对象会包含类型信息,但事实并非如此。相反,您必须使用imap_fetchheader
从邮件中获取原始标头,并自行解析它们。
解析RFC822标头并不是完全简单的。对于简单的情况,您可以通过匹配^content-type:.*; *charset=([^;]+)
(不区分大小写)来匹配每一行。但要真正做到这一点,尽管你必须通过适当的RFC822系列解析器(如MailParse)运行整个消息头和正文。
然后你仍然遇到了忽略包含charset
信息的消息问题。对于这种情况,您需要使用mb_detect_encoding
。
在这种情况下,您想要使用与上面相同的方法阅读的标题是Content-Language
。然而,它经常不存在,在这种情况下,你不得不再次猜测。 CJK统一意味着所有语言都可以使用许多相同的字符,但您可以使用一些启发式来猜测:
消息所在的编码,来自上面。例如,如果它是EUC-CN,你的语言可能会简化为中文。
文本中存在任何假名(U + 3040-U + 30FF - >日语)或韩文(U + AC00-U + D7FF - >韩文)。
简体中文与繁体中文字符的存在。虽然某些角色可以代表其中任何一个,但其他角色(两个变体之间的笔画有明显变化)只能代表一个。检测其存在的简单方法是尝试将字符串编码为GBK和Big5编码,并查看它是否失败。即如果你不能编码为GBK但你可以编译为Big5,它将是繁体中文。