Chinaunix

标题: 中文编码问题 [打印本页]

作者: kejiake    时间: 2012-07-09 15:41
标题: 中文编码问题
本帖最后由 kejiake 于 2012-07-10 09:15 编辑

我有个文件,编码是:
ISO-8859 text
系统编码是:
LANG=zh_CN

文件内容:
F1(0)=222|F2(0)=赵珅珅|F3(1)=20120501|F4(1)=20120531|F5(12)=动感地带
代码:
open( FILEIN, "a.data" ) || die("a.data file not find!");
while (<FILEIN>) {
chomp;
%test=split /=|\|/;
while ( ( my $key, my $value ) = each %test ) {
                print "$key=>$value\n";
        }
}

如果这样分割的话,输出的结果是:
F4(1)=>20120531
F3(1)=>20120501
?>
F1(0)=>222
F5(12)=>动感地带
F2(0)=>赵?
         
有乱码出现。请教下各位这样的问题该怎么解决?
作者: kejiake    时间: 2012-07-09 16:10
文件很简单:a.data:
F1=222|F2=赵珅珅|F3=20120501|F4=20120531|F5=动感地带
代码也简单:test.pl
open( FILEIN, "a.data" ) || die("a.data file not find!");
while (<FILEIN>) {
        %test = split /\||=/;
        while ( ( my $key, my $value ) = each %test ) {
                print "$key=>$value\n";
        }
}

可输出的结果却是:
F4=>20120531
F5=>动感地带

F3=>20120501
?>
F2=>赵?
        F1=>222
作者: cdtits    时间: 2012-07-09 16:30
  1.     %test = /(F\d+)=(.*?)(?=\|F|$)/g;
复制代码

作者: kejiake    时间: 2012-07-09 16:53
回复 3# cdtits


    没见过这种给hash赋值的写法,能解释下么?
作者: cdtits    时间: 2012-07-09 16:59
回复 4# kejiake


    跟 split 赋值一样的。那个可行不?
作者: kejiake    时间: 2012-07-09 17:03
回复 5# cdtits


    对于这个例子是可行的,如果文件内容是这样的呢:括号和括号里的内容无视。
F1(0)=222|F2(0)=赵珅珅|F3(1)=20120501|F4(1)=20120531|F5(12)=动感地带

作者: kejiake    时间: 2012-07-10 09:24
米人么。。。
作者: cdtits    时间: 2012-07-10 09:29
  1. %test = /(F.*?)=(.*?)(?=\|F|$)/g;
复制代码

作者: kejiake    时间: 2012-07-10 09:42
OK了。谢谢。能解释下么?
%test = /(F.*?)=(.*?)(?=\|F|$)/g;

%test = split /\||=/;

差别在哪里?
作者: zhlong8    时间: 2012-07-10 14:32
3楼的代码有点小惊喜啊
作者: xmchenb    时间: 2012-07-11 16:13
搞不懂3楼的代码,求解析
作者: xmchenb    时间: 2012-07-11 17:48
my $_= "F1(0)=222|F2(0)=赵珅珅|F3(1)=20120501|F4(1)=20120531|F5(12)=动感地带";

my %z = /(F.*?)=(.*?)(?=\|F|$)/g;

while(my ($k,$v)=each %z)
{
        print $k,"=>",$v,"\n";
}

完整程序
作者: blackold    时间: 2012-07-12 20:06
编码问题还是用 Encode 吧。
作者: pigkingone    时间: 2012-08-04 08:21
处理中文先转内部编码
作者: sjdy521    时间: 2012-08-04 09:04
这个问题的本质应该不在于split或者其他正则写法
因为包含了中文字符,应该先统一decode成unicode字符再做相同的处理就没问题了
作者: zhaoshuaijiang    时间: 2012-08-06 12:37
建议可以参考这个:http://www.php-oa.com/2008/12/13/perl-unicode.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2