perl中文字符编码问题

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是乱码,请高手指点,谢谢
open FH,"$file" or die "fail to read file $!";

上面的改为:
open FH,"<:utf8","$file" or die "fail to read file $!";
应该就可以了。指定输入文件编码为utf8并自动解码。
或者用"<:encoding(utf"来读入。二者的区别是:utf8不進行强制检查,而:encoding(utf要检查输入是否为有效utf8编码。一般我都是用"<:utf8"。

如果没有指定输入编码,比如对于某个汉字假设编码为EEDD,读入的时候就分两个来读并放在内存里,一个是EE,另一个是DD,而不是把EEDD作为一个整体放起来了。由于你把输出指定为utf8,EE可能会输出成utf8形式的XXEE,DD可能会输出utf8形式的XXDD,因为高字节非零,单个的字码都不是acsii码范围之内,所以要转换成utf8形式,所以一般这样的得到的输出文件都会比原文件大。
我按你的方法试了一下,返回错误信息,可是我读入的文件确实是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.
可能是gb2312编码的,试试:
open FH,"<:encoding(gbk)","$file" or die "fail to read file $!";