我已经知道如何用文件里逐行的非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‘\ XD 4’不映射到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>){
...
}
但是,这是太多的工作,不是简单的编码$过滤行一行内容就更加麻烦。
我想我误解你的问题。 我想你想要做的是阅读在非UTF-8编码文件,然后用数据在你的程序UTF-8玩什么。 这件事情要容易得多。 你用正确的编码读取数据后,Perl的内部表示这是UTF-8。 所以,只要你有做什么。
当你写它退了出来,用你想要将其保存为任何编码。 不过,你不必把它放回去在文件中使用它。
老答案
Perl的I / O层只能读取数据,假设其已经正确编码。 它不会转换编码你。 告诉打开使用UTF8,你告诉它,它已经是UTF8。
你必须使用的编码 ,就像你已经展示了(除非你想编写自己的I / O层)模块。 您可以字节转换为UTF-8,或者如果你知道的编码,就可以从一种编码转换为另一种。 因为它看起来像你已经知道的编码,您可能希望from_to()
函数。
如果你刚开始用Perl和Unicode,经过Juerd的Perl的Unicode的建议你做任何事情之前。
的:编码层将返回UTF-8,适合于Perl的用途。 也就是说,perl的将识别每一个字符一个字符,即使是多个字节。 根据你要去旁边的数据做什么,这可能是足够的。
但是,如果你正在做的对数据进行处理,其中的perl将尝试从UTF8降级了,你要么需要告诉perl的不(例如,做一个binmode(STDOUT,“:UTF8”)来告诉Perl的输出到标准输出应是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(等长($条)将报告的UTF8字符数),并已被明确告知(由-CO)是STDOUT将接受UTF8,而在另一方面, perl的不进行关于数据的假设(等长($条)将报告字节数),以及刚刚打印出来的是。