Chinaunix
标题:
请教!perl处理中文出现部分乱码
[打印本页]
作者:
woshiqhj
时间:
2010-06-21 18:48
标题:
请教!perl处理中文出现部分乱码
大家好!
我用perl处理文本文件,文本有20000多行,处理的结果绝大部分中文正确,只有几行出现乱码,请问这是怎么回事?
文本脚本都是ANSI格式的。
作者:
wxlfh
时间:
2010-06-21 18:58
这样提问,我觉得谁也帮不了你。
作者:
woshiqhj
时间:
2010-06-21 19:15
那请问一下大家有没遇到过这样的问题呢?只有一小部分出现了乱码
手头上没有代码,等会贴上来
作者:
ztbsuper
时间:
2010-06-21 19:22
encode吧
还有的情况就是原始文件的编码就很奇怪
我前几天在解析一个svg的时候,使用了各种编码解析出来都不对,最后我用UE把原始SVG的编码改成了ANSI/ASCII,然后用ISO-8859-1解出来又对了,但是在excel打开时还是乱码,UE和其他编辑器正常
作者:
Shell_HAT
时间:
2010-06-21 21:56
把perl代码和乱码的文字贴出来看看?
作者:
woshiqhj
时间:
2010-06-23 13:21
文件存储的格式是:
广州广佛城巴1线
去程:罗冲围客运站总站-金沙洲路-洲村市场-草场-丰岗-流潮路口-沿江公园-里水车站-岗头村(里水镇)-宏岗市场-白岗市场-南海和顺车站总站(12站)
回程:南海和顺车站总站-白岗市场-宏岗市场-岗头村(里水镇)-里水车站-沿江公园-流潮路口-丰岗-草场-洲村市场-金沙洲路-罗冲围客运站总站(12站)
复制代码
代码如下:
#!/usr/bin/perl -w
$source = "./test.txt";
open(INFILE,"<",$source)
or die("无法打开$source:$!\n");
while(<INFILE>)
{
@zd = ();
chomp();
if(/去程|回程|单向行驶/)
{
($fx,$zd_all) = split(":",$_);
@zd = split("-",$zd_all);
if($fx eq "去程")
{
$fx = "下行";
}
elsif($fx eq "回程")
{
$fx = "上行";
}
}
else
{
$lx = $_;
}
foreach (@zd)
{
print $lx,":",$_,":",$fx,"\n";
}
}
close(INFILE);
复制代码
输出到文件出现
广州广佛城巴1线:南?下行
广州广佛城巴1线:南?上行
复制代码
预计输出是:
广州广佛城巴1线:南海和顺车站总站(12站):下行
广州广佛城巴1线:南海和顺车站总站(12站):上行
复制代码
现在用如下脚本,就没有出现这样的情况了
@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
if not exist Bus-station-list mkdir Bus-station-list
perl -x -S %0 %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
goto endofperl
@rem ';
#!/usr/bin/perl -w
#line 15
use Encode;
open(FILE,"<","dir.txt") or die("err:$!");
while(<FILE>)
{
chomp($filename = $_);
open(FILE1,"<","./finish/$filename") or die("err:$!\n");
open(FILE2,">","./Bus-station-list/$filename") or die("err:$!\n");
while(<FILE1>)
{
chomp();
$len = index($_,":");
if($len == -1)
{
$lx = $_;
}
elsif($len == 4 or $len == 8)
{
$tmp_fx = substr($_,0,$len);
$tmp_zd_all = substr($_,$len+2);
$count = 1;
while(($num = index($tmp_zd_all,"-")) != -1)
{
$zm = substr($tmp_zd_all,0,$num);
print FILE2 $lx,",",$zm,",","$tmp_fx",",","$count",",",",","\n";
$tmp_zd_all = substr($tmp_zd_all,$num+1);
$count++;
}
$tmp_zd_all =~ s/\((\d)+站\)//;
print FILE2 $lx,",",$tmp_zd_all,",","$tmp_fx",",","$count",",",",","\n";
}
else
{
print "err:\n";
}
}
close(FILE1);
close(FILE2);
}
close(FILE);
__END__
:endofperl
复制代码
作者:
woshiqhj
时间:
2010-06-23 13:24
中间尝试过用Encode,但是还是出现以上情况
作者:
woshiqhj
时间:
2010-06-23 13:26
第17行use Encode;忘了删去了
作者:
iamlimeng
时间:
2010-06-23 14:54
这个问题是这一句导致的:
($fx,$zd_all) = split(":",$_);
split用全角字符来分隔,是可能会出问题的,有两种解决办法:
1.将数据文件中的全角冒号换成半角冒号,split(":",$_);;
2.用匹配代替split:($fx,$zd_all) = ($_ =~ /(.*?):(.*)/),不需要改数据文件
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2