MIME :: QuoterdPrint解码perl脚本中除空白之外的所有内容

时间:2018-02-01 16:28:16

标签: perl character-encoding decode mime

我正在用Perl的 Net :: IMAP :: Simple 模块编写一个简单的imap客户端。 我想在标准输出上打印消息主题。主题在Quoted-Printables中编码,因此我必须使用 MIME :: QuotedPrint decode_qp()函数对其进行解码。 一切都打印得很好,除了空格,它们仍然编码,我不知道为什么。输出现在看起来像这样:

[073] =?UTF-8?Q?[Myawesome_subject_topic]?= =?UTF-8?Q?_Сообщение?= =?UTF-8?Q?_номер?=

如您所见,空格位于?=和=?UTF-8?Q?_'tags'之间。 不知道如何处理它们。相关部分的代码如下

my $nm = $imap->select('INBOX');
for (my $i = 1; $i <= $nm; $i++) {
if ($imap->seen($i)) {
    print '*';
} 
else {
    print " ";
}
my $es = Email::Simple->new(join '', @{ $imap->top($i) } );
my $decoded = $es->header('Subject');
$decoded = decode_qp($decoded);
printf("[%03d] %s\n", $i, $decoded);
}

更新和解决方案

  1. 使用编码模块而不是 MIME :: QuotedPrint

    use Encode qw(decode);

  2. 像这样解码主题

    $decoded = decode("MIME-Header", $encoded);

  3. 下面接受的答案中有关该主题的其他信息

1 个答案:

答案 0 :(得分:1)

您无法使用quoted-printable对完整主题值进行简单解码,因为不会对完整主题进行编码。如果您有类似

的内容
 Subject: =?UTF-8?Q?AAAAAAAA?=   =?UTF-8?Q?BBBBBBBB?=

你必须分别对=?CHENC?Q?ENCODED?=中的每一个进行解码,将ENCODED部分解码为quoted-printable,然后根据字符编码CHENC解释结果(即你的UTF-8)具体情况)。完成此操作后,用解码数据替换整个=?...?=部分。

有关详细信息,请参阅RFC 2047。对于Perl中的现有实现,请参阅示例Encode::MIME::Header。另请参阅Decode an UTF8 email header