如何在Perl中将输入文件转换为UTF-8编码?

Mik*_*ke 7 unicode perl utf-8 character-encoding

我已经知道如何将文件的非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", $_); 
...}
Run Code Online (Sandbox Code Playgroud)

但我认为Perl可以直接将整个输入文件编码为UTF-8格式,所以我尝试了类似的东西

#outfile.txt is in GB-2312 encode
open my $filter,"<:utf8",'c:/outfile.txt'; 
Run Code Online (Sandbox Code Playgroud)

(Perl说像"utf8"\ xD4"没有映射到Unicode")

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

(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>){
...
} 
Run Code Online (Sandbox Code Playgroud)

但这是太多的工作,它比简单地逐行编码$ filter的内容更麻烦.

bri*_*foy 5

我想我误解了你的问题.我想你想要做的是读取非UTF-8编码的文件,然后在程序中使用UTF-8数据.这更容易.使用正确的编码读取数据后,Perl在内部将其表示为UTF-8.所以,只要做你必须做的事情.

当您将其写回时,请使用您想要保存的任何编码.但是,您不必将其放回文件中即可使用它.


老答案

Perl I/O层只读取数据,假设它已经正确编码.它不会为你转换编码.通过告诉open使用utf8,你告诉它它已经是utf8了.

您必须像显示的那样使用编码模块(除非您想编写自己的I/O层).您可以将字节转换为UTF-8,或者如果您知道编码,则可以从一种编码转换为另一种编码.由于看起来您已经知道编码,因此您可能需要该from_to()功能.

如果您刚开始使用Perl和Unicode,请在执行任何操作之前先查看Juerd的Perl Unicode建议.