2012-09-16 56 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];