4

我正在尝试将 → (右箭头,→或 unicode 2192 hex)编码到电子邮件主题行中。

当我使用 php 时,mb_encode_mimeheader()我得到的价值与使用 Thunderbird 或 Gmail 做同样的事情时不同。但是当 php 生成的电子邮件到达时,字符没有正确显示。此外,PHPmb_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 电子邮件标头值进行编码,以便邮件客户端正确解码?

4

1 回答 1

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?=
于 2012-11-16T12:00:40.963 回答