perl中文字符编码问题

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.

surfybeach
回复 #3 jetgm 的帖子

可能是gb2312编码的,试试:
open FH,"<:encoding(gbk)","$file" or die "fail to read file $!";