【发布时间】:2012-03-10 04:35:36
【问题描述】:
想要将以下原始邮件主题转换为普通的 UTF-8 文本:
=?utf-8?Q?Schuker_hat_sich_vom_=C3=9Cbungsabend_(01.01.2012)_abgem?= =?utf-8?Q?eldet?=
真正的文字是:
Schuker hat sich vom Übungsabend (01.01.2012) abgemeldet
我的第一个转换方法:
$mime = '=?utf-8?Q?Schuker_hat_sich_vom_=C3=9Cbungsabend_(01.01.2012)_abgem?= =?utf-8?Q?eldet?=';
mb_internal_encoding("UTF-8");
echo mb_decode_mimeheader($mime);
这给了我以下结果:
Schuker_hat_sich_vom_Übungsabend_(01.01.2012)_abgemeldet
(这里的问题:我做错了什么?为什么会出现这些下划线?)
我的第二种转换方法:
$mime = '=?utf-8?Q?Schuker_hat_sich_vom_=C3=9Cbungsabend_(01.01.2012)_abgem?= =?utf-8?Q?eldet?=';
echo imap_utf8($mime);
这给了我以下(正确的)结果:
Schuker hat sich vom Übungsabend (01.01.2012) abgemeldet
为什么会这样?我应该依靠哪种方法?
我问的原因是我之前问过另一个mail subject decoding related question,mb_decode_mimeheader 是解决方案,而这里imap_utf8 是要走的路。我如何确保解码这两个示例的所有内容都是正确的:
=?utf-8?Q?Schuker_hat_sich_vom_=C3=9Cbungsabend_(01.01.2012)_abgem?= =?utf-8?Q?eldet?
和
=?UTF-8?B?UmU6ICMyLUZpbmFsIEFjY2VwdGFuY2UgdGVzdCB3aXRoIG5ldyB0ZXh0IHdpdGggU2xvdg==?= =?UTF-8?B?YWsgaW50ZXJwdW5jdGlvbnMgIivEvsWhxI3FpcW+w73DocOtw6khxYgi?=
应该给我预期的结果:
Schuker hat sich vom Übungsabend (01.01.2012) abgemeldet
和
Re:#2-最终验收测试,新文本带有斯洛伐克语解释“+ľščťžýáíé!ň”
【问题讨论】:
-
您确定真实文本中包含空格吗?看起来它是用下划线编码的,或者编码它的应用程序有问题。不需要对空格进行编码,即使它被编码,也应该是
=20而不是下划线。 -
是的,真正的文本包含空格。请参阅修改后的问题。谢谢!
-
这就是 RFC 2048 修改quoted-printable 以用于 7 位标头的方式。 =?encoding?x?...?= 包装器也在该规范中定义。 - 如果
imap_utf8给你正确的结果,我会毫不犹豫地使用它(但是,我会犹豫首先使用PHP,所以我可能不是一个合法的来源:-)mb_decode_mimeheaders如果您将"Subject: "放在测试字符串前面,是否可以正常工作? -
不,添加
Subject没有帮助。仅使用imap_utf8无济于事,因为它无法转换第二个主题行Re: #2... -
我假设
imap_utf8()在开头添加了一个BOM(字节顺序标记),所以字符串不相等(不可见字符)