【问题标题】:UTF-8 character encoding for email headers with PHP使用 PHP 对电子邮件标头进行 UTF-8 字符编码
【发布时间】:2012-11-05 03:31:08
【问题描述】:

我正在尝试将 →(右箭头,→ 或 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?=

Thunderbird 和 Gmail 中 PHP 的编码如下:

我完全被 PHP 的行为弄糊涂了,因为它似乎没有产生标准的结果。

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

【问题讨论】:

标签: php character-encoding mime


【解决方案1】:

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

<?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?=

【讨论】:

  • 谢谢!我自己才得到这个。似乎向后必须为一个字符串设置整个子系统的内部编码。我已经采取了存储原始值,将其更改为所需值,然后再次恢复原始值以确保安全!
  • @artfulrobot 是的,但你为什么要对 utf-8 以外的任何其他内部编码进行操作:P
  • mb_encode_mimeheader() 对于将长标题拆分为多行并添加缩进很有用。所以它对于纯 ASCII 标头也很有用。不过好点,我可能应该将我的默认值更新为 UTF-8,因为它卡在拉丁语 1 上
  • @artfulrobot 我的意思是默认的内部编码可能是像ISO-8859-1 这样无用的东西(甚至不能编码),如果你想要ASCII,UTF-8 与ASCII 完全兼容。任何 ASCII 编码的字符串也是 UTF-8 编码的字符串。
  • 是的。我在英国,货币符号 £ 经常存在问题,它在 ISO-8859-1 中并且(显然)在 UTF-8 中不同。可能也需要运行这些字符串。
猜你喜欢
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2017-08-27
  • 2011-07-02
  • 1970-01-01
  • 2019-10-05
相关资源
最近更新 更多