jetgm
perl中文字符编码问题
被perl编码的问题困扰了好几天,从sina下载的utf-8编码的文件,我想批量删除指定的行
use strict;
use warnings;
use Encode;
foreach my $file (glob "blog*.html"){
print "$file/n";
open FH,"$file" or die "fail to read file $!";
open WH,">:encoding(utf8)","bak/$file" or die "fail to open file $!";
my @line=<FH>;
my @ot=@line[0..23,202..$#line-1];
#foreach (@ot){print WH encode("utf8",$_);}
foreach (@ot){print WH $_;}
}
close WH;
close FH;
删除是成功的,但是生成的bak/blog*.html是乱码,请高手指点,谢谢
surfybeach
回复 #1 jetgm 的帖子
open FH,"$file" or die "fail to read file $!";
上面的改为:
open FH,"<:utf8","$file" or die "fail to read file $!";
应该就可以了。指定输入文件编码为utf8并自动解码。
或者用"<:encoding(utf8)"来读入。二者的区别是:utf8不進行强制检查,而:encoding(utf8)要检查输入是否为有效utf8编码。一般我都是用"<:utf8"。
如果没有指定输入编码,比如对于某个汉字假设编码为EEDD,读入的时候就分两个来读并放在内存里,一个是EE,另一个是DD,而不是把EEDD作为一个整体放起来了。由于你把输出指定为utf8,EE可能会输出成utf8形式的XXEE,DD可能会输出utf8形式的XXDD,因为高字节非零,单个的字码都不是acsii码范围之内,所以要转换成utf8形式,所以一般这样的得到的输出文件都会比原文件大。
jetgm
谢谢surfybeach的解答,但是还是不行
我按你的方法试了一下,返回错误信息,可是我读入的文件确实是utf-8文件
utf8 "/x8D" does not map to Unicode at E:/test.pl line 13, <
FH> line 422.
utf8 "/xFF" does not map to Unicode at E:/test.pl line 13, <
FH> line 422.
utf8 "/xB0" does not map to Unicode at E:/test.pl line 13, <
FH> line 422.
utf8 "/x80" does not map to Unicode at E:/test.pl line 13, <
FH> line 422.
utf8 "/xCB" does not map to Unicode at E:/test.pl line 13, <
FH> line 422.
utf8 "/xA1" does not map to Unicode at E:/test.pl line 13, <
FH> line 424.
utf8 "/x80" does not map to Unicode at E:/test.pl line 13, <
FH> line 424.
utf8 "/xFB" does not map to Unicode at E:/test.pl line 13, <
FH> line 424.