Perl MIME::Tools - CRLF 更改为 LF
Posted
技术标签:
【中文标题】Perl MIME::Tools - CRLF 更改为 LF【英文标题】:Perl MIME::Tools - CRLF changed to LF 【发布时间】:2018-08-23 13:21:40 【问题描述】:我使用 MIME::Parse 解析多部分 MIME。我想要完整的部分,而不仅仅是头部或身体。据我所知,它将 CRLF 更改为 LF。这是个问题。
use MIME::Parser;
my $parser = new MIME::Parser ();
$parser->decode_headers (0);
$parser->decode_bodies (0);
$parser->output_to_core (1);
open (F, "myfile.txt");
my $mime = $parser->parse (\*F);
close (F);
my $mp = $mime->parts (0); // get the 1st part
my $ct = $mp->as_string ();
my $h = unpack ("H*", $ct);
$h = join (' ', $h =~ /(..)/g);
print "\n$h\n"; // inspect and compare with myfile.txt in a hex-editor
如果我使用十六进制编辑器查看 myfile.txt,则行分隔符是 CRLF (0x0d 0x0a)。 如果我检查打印输出,则它们更改为 LFs (0x0a)。
这是为什么呢?如何获取原始内容?
谢谢! 克里斯
【问题讨论】:
您使用的是 Windows 系统吗?如果是这样,请在读取文件之前尝试binmode F;
,以禁用 Perl 在 Windows 上使用的默认 :crlf
层。见PerlIO
和open
。
最好使用三参数open
,词法文件句柄,尤其是错误检查:open my $fh, '<', 'myfile.txt' or die $!;
【参考方案1】:
您的问题缺少有关您解码的数据外观的重要信息。但我会假设这些要么具有明确给定的内容类型text/plain
,要么隐含地具有此内容类型(即没有给出内容类型标头)。 text/plain
表示 ASCII 数据(除非定义了 charset
标头),并且行尾将用于特定于提取数据的环境:这意味着 Windows 上的 CRLF 和 Linux、MacOS 和其他 UNIX 或类 UNIX 系统上的 LF .邮件中的原始行结尾是什么并不重要,重要的是目标环境中使用的行结尾。
如果你真的想以原始行结尾,那么内容应该声明为二进制(即内容类型application/octet-stream
或类似,但绝对不是text/*
)并且数据需要用内容编码 - transfer-encoding 适用于二进制数据,即base64。
【讨论】:
以上是关于Perl MIME::Tools - CRLF 更改为 LF的主要内容,如果未能解决你的问题,请参考以下文章
在 ./MIME/Parser/Filer.pm 第 365 行调用未定义的子例程 utf8::SWASHGET