我有一个表单的电子邮件主题:
=?utf-8?B?T3.....?=
电子邮件的正文是 utf-8 base64 编码的 - 并且解码得很好。我目前正在使用 Perl 的 Email::MIME 模块来解码电子邮件。
=?utf-8 分隔符的含义是什么?如何从该字符串中提取信息?
encoded-word
令牌(根据RFC 2047)可以出现在某些标头的值中。它们被解析如下:
=?<charset>?<encoding>?<data>?=
在这种情况下,字符集是 UTF-8,编码是B
base64(另一个选项是Q
Quoted Printable)。
要读取它,首先解码 base64,然后将其视为 UTF-8 字符。
另请阅读各种 Internet 邮件 RFC 以获取更多详细信息,主要是RFC 2047。
由于您使用的是 Perl,因此Encode::MIME::Header可能有用:
概要
use Encode qw/encode decode/; $utf8 = decode('MIME-Header', $header); $header = encode('MIME-Header', $utf8);
抽象的
这个模块实现了 RFC 2047 Mime Header Encoding。有 3 个变体编码名称;MIME-标头、MIME-B 和 MIME-Q。区别如下所述
decode() encode() MIME-Header Both B and Q =?UTF-8?B?....?= MIME-B B only; Q croaks =?UTF-8?B?....?= MIME-Q Q only; B croaks =?UTF-8?Q?....?=
我认为 Encode 模块使用编码处理它MIME-Header
,所以试试这个:
use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);
查看RFC2047。'B' 表示最后两个 '?' 之间的部分是 base64 编码的。'utf-8' 自然意味着解码后的数据应该被解释为 UTF-8。
MIME-tools 中的 MIME::Words也适用于此。我遇到了 Encode 的一些问题,发现 MIME::Words 在 Encode 没有的某些字符串上成功。
use MIME::Words qw(:all);
$decoded = decode_mimewords(
'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
);
这是标头字符集标签的标准扩展,在RFC2047中指定。