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

Php 将imap主题行中的Windows-1252字符解码为UTF-8,php,encoding,utf-8,character-encoding,Php,Encoding,Utf 8,Character Encoding,我有一个网站,允许人们在Outlook中使用电子邮件的主题行向其发布内容。使用PHP和imap,我获取文本的主题行并将其存储在mysql数据库中。但每隔一段时间,就会有人把网站上的文字复制到那封邮件的主题行,我就会收到乱码。与此类似: =?Windows-1252?Q?\u每天\u在办公室\u我们\u回收纸板、铝= =?Windows-1252?Q?=96_won=92t_你加入吗_us=3F= 我所做的是尝试解码此文本,以便使用以下代码在页面上正常显示: $subject = strip_ta

我有一个网站,允许人们在Outlook中使用电子邮件的主题行向其发布内容。使用PHP和imap,我获取文本的主题行并将其存储在mysql数据库中。但每隔一段时间,就会有人把网站上的文字复制到那封邮件的主题行,我就会收到乱码。与此类似:

=?Windows-1252?Q?\u每天\u在办公室\u我们\u回收纸板、铝= =?Windows-1252?Q?=96_won=92t_你加入吗_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;
}
$subject=strip_标签($mailHeader->subject);
$header=imap\u mime\u header\u decode($subject);
$subject=“”;
对于($i=0;$itext;
}
完成后,我去掉了大部分乱码文本,但留下了em破折号的替换字符和原始主题行文本中的卷曲引号。请参见下面的结果:

每天在我们的办公室里,我们回收纸板,铝,� 赢了�你为什么不加入我们

网站的字符集设置为UTF-8。当我将网站的字符集设置为ISO-8859-1时,替换字符将替换为卷曲引号和em破折号,这很好,但我想将网站的字符集保留为UTF-8


关于如何在不将字符集更改为ISO-8859-1的情况下删除替换字符的任何帮助都将非常有用。谢谢。

imap\U mime\U header\U decode返回的每个对象都包含一个
字符集
属性,您将忽略该属性。您需要在循环中将每个对象转换为UTF-8,方法如下:

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

作为替代,考虑使用OR函数。这两个函数都完成了对MIME头进行解码的整个工作,在PHP的内部编码中返回字符串(通常是UTF-8)。上面的代码

< P>代码,除了一个小的变化到结束:

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

谢谢,那太完美了。你发布的代码中需要进行一个小的编辑。我会在下面发布它,以防有人有一天偶然发现。我已经将你的修复整合到我的答案中。