将imap主题行中的Windows-1252字符解码为UTF-8

时间:2017-11-16 21:14:01

标签: php encoding utf-8 character-encoding

我有一个网站,允许人们使用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的情况下解除替换字符的任何帮助都会很棒。感谢。

2 个答案:

答案 0 :(得分:0)

imap_mime_header_decode返回的每个对象都包含charset属性,您忽略该属性。您需要使用类似以下内容将每个转换为UTF-8:

$subject .= mb_convert_encoding($header[$i]->text, "UTF-8", $header[$i]->charset);

作为替代方案,请考虑使用mb_decode_mimeheadericonv_mime_decode_headers函数。这两个函数都完成了为您解码MIME头的整个工作,以PHP的内部编码(通常是UTF-8)返回一个字符串。

答案 1 :(得分:0)

以上代码的工作原理除了最后一个小的改动:

$subject .= mb_convert_encoding($header[$i]->text, "UTF-8", $header[$i]->charset);