Perl:File::BOM模块和:编码和输出的顺序缺陷

问题描述 投票:0回答:1

让我们看看您已经指定了 open 函数的第二个参数,如下所示:

open my $fh, ">:via(File::BOM):encoding(UTF-8)", $file or die "Cannot open $file: $!";

在这里您首先指定

:via(File::BOM)
:encoding(UTF-8)"
, 然后,输出字符串将在中间被切断。

以下脚本尝试输出带有 BOM 的 UTF-8 文本文件, 内容应该是从“xxx yyyy1”到“xxx yyyy100”的字符串串联,尾随数字递增,并用“/”分隔。

#!/usr/bin/perl

# bomTest.pl

use strict;
use warnings;
use File::BOM;
use feature 'say';

my $file = '/home/cf/Desktop/foo.txt';

open my $fh, ">:via(File::BOM):encoding(UTF-8)", $file or die "Cannot open $file: $!";

say $fh 'xxx yyyy1 / xxx yyyy2 / xxx yyyy3 / xxx yyyy4 / xxx yyyy5 / xxx yyyy6 / xxx yyyy7 / xxx yyyy8 / xxx yyyy9 / xxx yyyy10 / ' .
'xxx yyyy11 / xxx yyyy12 / xxx yyyy13 / xxx yyyy14 / xxx yyyy15 / xxx yyyy16 / xxx yyyy17 / xxx yyyy18 / xxx yyyy19 / xxx yyyy20 / ' .
... snip ...
'xxx yyyy71 / xxx yyyy72 / xxx yyyy73 / xxx yyyy74 / xxx yyyy75 / xxx yyyy76 / xxx yyyy77 / xxx yyyy78 / xxx yyyy79 / xxx yyyy80 / ' .
'xxx yyyy81 / xxx yyyy82 / xxx yyyy83 / xxx yyyy84 / xxx yyyy85 / xxx yyyy86 / xxx yyyy87 / xxx yyyy88 / xxx yyyy89 / xxx yyyy90 / ' .
'xxx yyyy91 / xxx yyyy92 / xxx yyyy93 / xxx yyyy94 / xxx yyyy95 / xxx yyyy96 / xxx yyyy97 / xxx yyyy98 / xxx yyyy99 / xxx yyyy100';

close $fh;

输出文件 foo.txt 将是 UTF-8 文件,文件顶部带有 BOM (0x EF BB BF),但字符串将在中间终止,如下所示:

xxx yyyy1 / xxx yyyy2 / xxx yyyy3 / xxx yyyy4 / xxx yyyy5 / xxx yyyy6 / xxx yyyy7 / xxx yyyy8 / xxx yyyy9 / xxx yyyy10 / xxx yyyy11 / xxx yyyy12 / xxx yyyy13 / xxx yyyy14 / xxx yyyy15 / xxx yyyy16 / xxx yyyy17 / xxx yyyy18 / xxx yyyy19 / xxx yyyy20 / ...剪... xxx yyyy71 / xxx yyyy72 / xxx yyyy73 / xxx yyyy74 / xxx yyyy75 / xxx yyyy76 / xxx yyyy77 / xxx yyyy78 / xxx yyyy79 / xxx yy

输出在“xxx yyyy80”中间停止。

现在,如果您像这样更改脚本:

open my $fh, ">:encoding(UTF-8):via(File::BOM)", $file or die "Cannot open $file: $!";

改变的点是I-O层的顺序。 您首先指定了 :encoding(UTF-8),最后指定了 :via(File::BOM)。

然后脚本完全运行到“xxx yyyy100”。

这是什么现象? 是Perl编码的bug吗? 或者是

File::BOM
模块之一? 或者说它们的规格是否合理?

perl unicode
1个回答
0
投票

答案已经在问题中:如果

">:via(File::BOM):encoding(UTF-8)"
不起作用,那是因为它应该是
">:encoding(UTF-8):via(File::BOM)"

来自文档,

# Writing little-endian UTF-16 file with BOM:
open(HANDLE, '>:encoding(UTF-16LE):via(File::BOM)', $filename)
© www.soinside.com 2019 - 2024. All rights reserved.