簡體   English   中英

如何在Perl中將輸入文件轉換為UTF-8編碼?

[英]How can I convert an input file to UTF-8 encoding in Perl?

我已經知道如何將文件的非utf8編碼內容逐行轉換為UTF-8編碼,使用類似下面的代碼:

# outfile.txt is in GB-2312 encode    
open my $filter,"<",'c:/outfile.txt'; 

while(<$filter>){
#convert each line of outfile.txt to UTF-8 encoding   
    $_ = Encode::decode("gb2312", $_); 
...}

但我認為Perl可以直接將整個輸入文件編碼為UTF-8格式,所以我嘗試了類似的東西

#outfile.txt is in GB-2312 encode
open my $filter,"<:utf8",'c:/outfile.txt'; 

(Perl說像“utf8”\\ xD4“沒有映射到Unicode”)

open my $filter,"<",'c:/outfile.txt'; 
$filter = Encode::decode("gb2312", $filter); 

(Perl在未打開的文件句柄上說“readline()!”

它們不起作用。 但有沒有辦法直接將輸入文件轉換為UTF-8編碼?

更新:

看起來事情並不像我想象的那么簡單。 我現在可以以環形方式將輸入文件轉換為UTF-8代碼。 我首先打開輸入文件,然后將其內容編碼為UTF-8,然后輸出到新文件,然后打開新文件以進行進一步處理。 這是代碼:

open my $filter,'<:encoding(gb2312)','c:/outfile.txt'; 
open my $filter_new, '+>:utf8', 'c:/outfile_new.txt'; 
print $filter_new $_ while <$filter>; 
while (<$filter_new>){
...
} 

但這是太多的工作,它比簡單地逐行編碼$ filter的內容更麻煩。

我想我誤解了你的問題。 我想你想要做的是讀取非UTF-8編碼的文件,然后在程序中使用UTF-8數據。 這更容易。 使用正確的編碼讀取數據后,Perl在內部將其表示為UTF-8。 所以,只要做你必須做的事情。

當您將其寫回時,請使用您想要保存的任何編碼。 但是,您不必將其放回文件中即可使用它。


老答案

Perl I / O層只讀取數據,假設它已經正確編碼。 它不會為你轉換編碼。 通過告訴open使用utf8,你告訴它它已經是utf8了。

您必須像顯示的那樣使用編碼模塊(除非您想編寫自己的I / O層)。 您可以將字節轉換為UTF-8,或者如果您知道編碼,則可以從一種編碼轉換為另一種編碼。 由於看起來您已經知道編碼,因此您可能需要from_to()函數。

如果您剛開始使用Perl和Unicode,請在執行任何操作之前先查看Juerd的Perl Unicode建議

:encoding層將返回UTF-8,適合perl的使用。 也就是說,perl會將每個字符識別為一個字符,即使它們是多個字節。 根據您接下來要對數據執行的操作,這可能就足夠了。

但是如果你正在對perl將嘗試從utf8降級它的數據做一些事情,你要么告訴perl不要(例如,做一個binmode(STDOUT,“:utf8”)告訴perl輸出到stdout應該是utf8),或者你需要讓perl將你的utf8視為二進制數據(分別解釋每個字節,並且對utf8字符一無所知。)

要做到這一點,您只需要在打開時應用其他圖層:

open my $foo, "<:encoding(gb2312):bytes", ...;

請注意,以下輸出將是相同的:

perl -we'open my $foo, "<:encoding(gb2312):bytes", "foo"; $bar = <$foo>; print $bar'
perl -CO -we'open my $foo, "<:encoding(gb2312)", "foo"; $bar = <$foo>; print $bar'

但在一種情況下,perl知道讀取的數據是utf8(因此長度($ bar)將報告utf8字符的數量)並且必須明確告知(通過-CO)STDOUT將接受utf8,而在另一種情況下, perl不對數據做任何假設(因此長度($ bar)將報告字節數),並按原樣打印出來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM