我有一个网站,允许人们使用Outlook中电子邮件的主题行向其发布内容。使用PHP和imap,我得到文本的主题行并将其存储在mysql数据库中。但每隔一段时间,有人会将网站上的文字复制到该电子邮件的主题栏中,我会收到乱码。与此类似:
=?视窗-1252 Q + _Every_day_in_our_offices_we_recycle_cardboard,铝?= =?视窗-1252 Q + = 96_won = 92t_you_join_us = 3F?=
我所做的是尝试解码此文本,以便使用以下代码在页面上显示正常:
$subject = strip_tags($mailHeader->subject);
$header = imap_mime_header_decode($subject);
$subject = "";
for($i=0;$i<count($header);$i++)
{
$subject .= $header[$i]->text;
}
完成后我摆脱了大部分乱码文本,但是留下了替换字符,用于短划线和原始主题行文本中的卷曲引号。请参阅以下结果:
我们办公室的每一天都在回收纸板,铝, 你加入我们吗?
网站的字符集设置为UTF-8。当我将网站字符集设置为ISO-8859-1时,替换字符将替换为卷曲引号和短划线,这很棒,但我想将网站的字符集保留为UTF-8。
如何在不将字符集更改为ISO-8859-1的情况下解除替换字符的任何帮助都会很棒。感谢。
答案 0 :(得分:0)
imap_mime_header_decode
返回的每个对象都包含charset
属性,您忽略该属性。您需要使用类似以下内容将每个转换为UTF-8:
$subject .= mb_convert_encoding($header[$i]->text, "UTF-8", $header[$i]->charset);
作为替代方案,请考虑使用mb_decode_mimeheader
或iconv_mime_decode_headers
函数。这两个函数都完成了为您解码MIME头的整个工作,以PHP的内部编码(通常是UTF-8)返回一个字符串。
答案 1 :(得分:0)
以上代码的工作原理除了最后一个小的改动:
$subject .= mb_convert_encoding($header[$i]->text, "UTF-8", $header[$i]->charset);