我有一些文本文件,我試圖用Windows上的Perl腳本進行轉換。記事本+中的文本文件看起來很正常,但我的腳本中的所有正則表達式都無法匹配。然後我注意到當我在NotePad +中打開文本文件時,狀態欄顯示「UCS-2 Little Endia」(原文如此)。我假設這對應於編碼UCS-2LE。因此,我創建「READFILE」和「WriteFile的」潛艇在Perl,像這樣:Perl中的Unicode不起作用
use PerlIO::encoding;
my $enc = ':encoding(UCS-2LE)';
sub readFile {
my ($fName) = @_;
open my $f, "<$enc", $fName or die "can't read $fName\n";
local $/;
my $txt = <$f>;
close $f;
return $txt;
}
sub writeFile {
my ($fName, $txt) = @_;
open my $f, ">$enc", $fName or die "can't write $fName\n";
print $f $txt;
close $f;
}
my $fName = 'someFile.txt';
my $txt = readFile $fName;
# ... transform $txt using s/// ...
writeFile $fName, $txt;
現在正則表達式匹配(雖然不經常比我預期的),但輸出包含穿插亞洲尋找字符的長串多餘的字符串正確的文字。我的代碼錯了嗎?或者記事本+編碼錯了?我應該如何繼續?
提供一些測試數據,它的一個附加hexdump都是一個好主意。顯示導致問題的* complete *代碼。如果你不能讓我們重現問題,我們只能推測。 – daxim 2010-07-22 07:40:23
@daxim:這裏的代碼是相當完整的,我無法檢查它的唯一原因是因爲我沒有記事本+編輯器與之比較。猜測這是一個BOM問題。 – 2010-07-22 08:00:59