使用PHP的电子邮件标头的UTF-8字符编码

时间:2012-11-16 11:51:48

标签: php character-encoding mime

我正在尝试将→(右箭头,→或unicode 2192十六进制)编码为电子邮件主题行。

当我使用php的mb_encode_mimeheader()时,当我使用Thunderbird或Gmail做同样的事情时,我会得到不同的价值。但是当php生成的电子邮件到达时,角色没有正确显示。此外,PHP的mb_decode_mimeheader()适用于PHP的输出,但不能解码来自其他电子邮件源的内容。

通过十六进制转储,我已经知道箭头的UTF-8表示是

<?php
$rarr = "\xe2\x86\x92";

mb_encode_mimeheader($rarr, 'UTF-8'); //     =?UTF-8?B?w6LChsKS?=
// whereas Tbird and Gmail produce:          =?UTF-8?B?4oaS?=
// and more manually:
'=?UTF-8?B?' . base64_encode($rarr).'?='; // =?UTF-8?B?4oaS?=

PHP的编码在Thunderbird和Gmail中出现:â

我对PHP的行为感到困惑,因为它似乎没有产生标准结果。

如何让PHP对UTF-8电子邮件标头值进行编码,以便邮件客户端正确解码?

1 个答案:

答案 0 :(得分:8)

似乎有一个忽略第二个参数的错误,当我添加内部编码时,我得到了正确的结果:

<?php
$rarr = "\xe2\x86\x92";
mb_internal_encoding( "UTF-8");
echo mb_encode_mimeheader($rarr, 'UTF-8'); //=?UTF-8?B?4oaS?=

但是

<?php
$rarr = "\xe2\x86\x92";

mb_encode_mimeheader($rarr, 'UTF-8'); //=?UTF-8?B?w6LChsKS?=

设置内部编码就足够了:

<?php
$rarr = "\xe2\x86\x92";
mb_internal_encoding( "UTF-8");
echo mb_encode_mimeheader($rarr); //=?UTF-8?B?4oaS?=