2012-09-16 57 views
2

我有简单的Perl脚本来比较两个文件。 结果我使用UTF8 BOM编码以不同文件编写。 要保存BOM文件中的文本,我将chr(65279)打印到结果文件的开头。有时输入的文本在文本的乞求中已经包含BOM char,并且我的脚本会再打印一次。如何在Perl中使用BOM编码检测UTF8

现在的问题是:我如何解决它,以便不打印此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; 
+4

为什么不干脆放弃BOM?对于UTF-8,它完全是可选的,因为UTF-8字节总是以相同顺序写入,而不管平台的字节顺序如何。 –

+0

我需要这个将输出文本文件传递给另一个只支持带有BOM的UTF8的应用程序,如果我将通过简单的UTF8编码传递文本文件 - 某些字符将会失真。 –

回答

3

地带它在阅读文件的内容(在您的示例应用s/^\x{FEFF}//$a[0]$b[0]),然后要么将其添加在输出的前面,当你print结果,如果你真的需要它,但更好 - 不要打印回来,因为UTF-8是无用的。

1

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

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