2012-03-15 71 views
1

file命令告訴我:如何在Perl中讀取Little-endian UTF-16 Unicode文本?

tmp.txt: Little-endian UTF-16 Unicode text, with CRLF line terminators

cathead等不能正確顯示此文件。

但是vim可以正確顯示它。 vim告訴我:

[~/tmp/tmp.txt] [utf-8,dos] 
"tmp.txt" [converted][dos] 

:set在vim說fileencoding=ucs-2le

所以在Perl:

open FH,'<:encoding(ucs-2le)',$file; 
while(<FH>){ 
    chomp; 
    # A start 
    print; 
    # Perl: Wide character in print at a.pl line 12, <FH> line 1 
    # And display incorrect 
    # A end 

    # B start 
    binmode STDOUT,":utf8"; 
    print; 
    # display incorrect too 
    # B end 

} 

我怎樣才能讀取該文件正確在Perl?

+0

對於它的價值,你的代碼完全適用於我對使用小尾數UTF-16,我剛剛創建的小文件。 (我不得不手動刪除BOM,通過編寫's/^ \ x {FEFF} //'來防止「Wide print in print」警告,因爲UCS-2不使用BOM。) – ruakh 2012-03-15 02:05:44

+0

你確定你的終端正在期待UTF-8? – cjm 2012-03-15 02:34:20

+0

'locale'是'en_US.UTF-8',vim中的':set'是'termencoding = utf-8',SecureCRT也是utf8 – everbox 2012-03-15 03:08:34

回答

3

我相信你的問題可以通過使用'<:encoding(UTF-16)''<:encoding(UTF-16LE)'來解決。我會先嚐試前者;如果文件具有字節順序標記(BOM),則是您所需要的。可能有一個BOM,這就是跳過你的腳本。 ucs-2le是一種較舊的格式,類似但不一樣。

欲瞭解更多信息:

Perl file encoding

Perl Encode