这个Perl字符串是用什么编码的?

4

我正在使用Mail::IMAPClient从imap服务器检索邮件头。它运行良好。但是,当邮件头包含任何非[a-z|A-Z|0-9]字符时,我会看到类似于以下字符串的内容:

  • 主题:Un message en =?UTF-8?B?ZnJhbsOnYWlzIMOgIGxhIGNvbg==?=(原始字符串:“Un message en français à la con”)

  • 正文: =C3=A9aeio=C3=B9=C3=A8=C3=A8(原始字符串:éaeioùèè)

    1. 这是什么奇怪的格式? 这是著名的“perl字符串内部”格式吗?
    2. 处理来自IMAP服务器的人类习语的最安全方式是什么?

如果您计划使用电子邮件进行任何操作,您应该至少具备基本的 MIME 知识。 - tripleee
2个回答

14

邮件正文是Quoted-Printable编码;邮件头部(主题)则是MIME“encoded-word”编码(使用base64的"B"类型)。处理这两种编码最好的方法是将邮件传递给一个能够处理MIME的模块,例如Email::MIME或更老但存在缺陷的MIME::Lite

例如:

# $message was retrieved from IMAP
my $mime = Email::MIME->new($message);
my $subject = $mime->header('Subject'); # automatically decoded
my $body = $mime->body_str; # also automatically decoded

不过,如果你需要在整个邮件消息的上下文之外处理它们,也有像Encode::MIME::HeaderMIME::QuotedPrint这样的模块。


7

这是用 quoted-printable 编码的。它是电子邮件中使用的标准编码方式,与 Perl 内部字符串格式无关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接