我有以下表单的电子邮件主题:
=?utf-8?B?T3.....?=
电子邮件的正文是utf-8 base64编码 - 并且解码得很好。 我目前正在使用Perl的Email :: MIME模块来解码电子邮件。
=?utf-8分隔符的含义是什么?如何从此字符串中提取信息?
答案 0 :(得分:35)
encoded-word
令牌(根据RFC 2047)可能会出现在某些标头的值中。它们的解析如下:
=?<charset>?<encoding>?<data>?=
在这种情况下,Charset是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 标头编码。有3个变种 编码名称; MIME-Header,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?....?=
答案 1 :(得分:17)
我认为Encode模块使用MIME-Header
编码来处理它,所以试试这个:
use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);
答案 2 :(得分:3)
结帐RFC2047。 'B'表示最后两个'?'之间的部分是base64编码的。 'utf-8'自然意味着解码数据应解释为UTF-8。
答案 3 :(得分:2)
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>',
);
答案 4 :(得分:1)
这是标题字符集标准的标准扩展,在RFC2047中指定。