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 层。见PerlIOopen 最好使用三参数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的主要内容,如果未能解决你的问题,请参考以下文章

在 Eclipse 中将换行从 CRLF 更改为 LF

如何更改行尾设置

部分解决合并冲突并查看新的差异/冲突

在 ./MIME/Parser/Filer.pm 第 365 行调用未定义的子例程 utf8::SWASHGET

在 Perl、套接字或命名管道 (fifos) 中啥更便携?

在 Perl 中有啥理由更喜欢 glob 而不是 readdir(反之亦然)?