【问题标题】:Decoding Windows-1252 characters in imap subject line to UTF-8将 imap 主题行中的 Windows-1252 字符解码为 UTF-8
【发布时间】:2018-04-30 13:14:38
【问题描述】:

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

=?Windows-1252?Q?_Every_day_in_our_offices_we_recycle_cardboard,铝?= =?Windows-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 的情况下摆脱替换字符的帮助都会很棒。谢谢。

【问题讨论】:

    标签: php encoding utf-8 character-encoding


    【解决方案1】:

    上面的代码除了最后的一个小改动之外可以正常工作:

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

    【讨论】:

    • 我已将您的修复纳入我的回答中。
    【解决方案2】:

    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)返回一个字符串。

    【讨论】:

    • 谢谢,太完美了。您发布的代码需要进行一些小的编辑。我会把它贴在下面,以防有一天其他人偶然发现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多