使用MIME::QuotedPrint编码异常,请问我哪里操作有误?
问题分析与解决
为什么会输出Imported today=?
首先,Quoted-Printable编码的核心规则是仅对非可打印ASCII字符、空格、以及=本身进行编码,可打印的ASCII字符(字母、数字、大部分符号)会直接保留,不会转成=XX的形式。
你看到的结尾=,是因为encode_qp默认会对输出进行行折叠(默认行宽76字符),若字符串长度接近行宽末尾,会用=作为软换行标记。不过你的字符串长度很短,这个等号更可能是打印格式问题或特定模块版本的行为,但核心问题是你误解了Quoted-Printable的编码逻辑——它不会对所有字符做全编码。
如何得到全=XX形式的编码?
如果你的需求是把所有字符都编码成=XX的十六进制形式,MIME::QuotedPrint默认做不到(它遵循标准规范),你可以自己实现这个逻辑:
my $decoded = "Imported today"; my $encoded = join '', map { sprintf "=%02X", ord($_) } split //, $decoded; print "\n$encoded\n";
这段代码会输出=49=6D=70=6F=72=74=65=64=20=74=6F=64=61=79,符合你想要的全编码形式。
如果你只是想去掉结尾的=
如果你的需求只是正常的Quoted-Printable编码,不想要多余的=,可以给encode_qp传递参数禁用行折叠:
$encoded = encode_qp($decoded, "\n", 1); # 第三个参数启用binmode,禁用行折叠
这样输出的就是Imported today,符合标准Quoted-Printable编码结果。
内容的提问来源于stack exchange,提问作者Steve Waring
相关产品推荐
相关产品推荐

