如何在Perl中检测带有BOM的UTF8编码

3
我有一个简单的Perl脚本,用于比较两个文件。我将结果写入UTF8 BOM编码的不同文件中。为了将文本保存在BOM文件中,我在结果文件的开头打印chr(65279)。有时输入文本已经包含了文本开头的BOM字符,而我的脚本会再次打印一次。
问题是:如何解决这个问题,避免重复打印BOM字符。
以下是我的Perl代码文本:
use strict;
use warnings;
use List::Compare;
use Cwd 'abs_path';
use open ':encoding(utf8)';
use open IO => ':encoding(utf8)';

open F, "<$ARGV[0]" or die $!;
open S, "<$ARGV[1]" or die $!;
my @a=<F>;
my @b=<S>;
close F;
close S;

my $lc = List::Compare->new(\@a, \@b);

my @intersection = $lc->get_intersection;
my @missing = $lc->get_unique;
my @extra = $lc->get_complement;

open EXTRA, ">".$ARGV[2]."file_extra.txt" or die("Unable to open the file");
open MISSING, ">".$ARGV[2]."file_missing.txt" or die("Unable to open the file");
open SUBTRACTED, ">".$ARGV[2]."file_subtr.txt" or die("Unable to open the file");

#Turn on UTF-8 BOM support
print EXTRA chr(65279);
print MISSING chr(65279);
print SUBTRACTED chr(65279);

print MISSING @missing;
print EXTRA @extra;
print SUBTRACTED @intersection;

close MISSING;
close EXTRA;
close SUBTRACTED;

5
为什么不完全放弃BOM呢?对于UTF-8来说,这是完全可选的,因为无论平台的字节序如何,UTF-8字节始终以相同的顺序编写。 - Martijn Pieters
我需要将输出的文本文件传递给另一个仅支持UTF8带BOM格式的应用程序,如果我传递简单的UTF8编码的文本文件,则某些字符将会失真。 - Volodymyr Prysiazhniuk
2个回答

4

在读取文件内容时去除它(例如,对于$a [0]和$b [0]应用s/^\x{FEFF}//),然后在输出结果时将其添加到前面(如果确实需要),但最好不要打印回来,因为对于UTF-8是无用的。


1
如果您有双重BOM,那么很可能是因为一个BOM来自您的输入。因此,在处理之前,您应该清理您的输入内容:
`s/^\x{FEFF}/ for $a[0], $b[0];`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接