如何在Perl中使用BOM编码检测UTF8

时间:2012-09-16 13:36:12

标签: perl file comparison

我有简单的Perl脚本来比较两个文件。 结果我使用UTF8 BOM编码写入不同的文件。 要在BOM文件中保存文本,我会将chr(65279)打印到结果文件的开头。有时输入文本在文本的乞讨中已经包含了BOM char,而我的脚本又打印了一个。

问题是:我如何解决此问题,不要两次打印此BOM char。

请参阅我的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;

2 个答案:

答案 0 :(得分:3)

在阅读文件内容时将其删除(在您的示例中将s/^\x{FEFF}//应用于$a[0]$b[0]),然后在print结果时将其添加到输出前面,如果你真的需要它,但更好 - 不要打印它,因为它对UTF-8没用。

答案 1 :(得分:1)

如果您有双重BOM,这可能是因为一个BOM来自您的输入。所以你应该在处理它之前清理你的输入:

s/^\x{FEFF}/ for $a[0], $b[0];