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. 广州广佛城巴1线
  2. 去程:罗冲围客运站总站-金沙洲路-洲村市场-草场-丰岗-流潮路口-沿江公园-里水车站-岗头村(里水镇)-宏岗市场-白岗市场-南海和顺车站总站(12站)
  3. 回程:南海和顺车站总站-白岗市场-宏岗市场-岗头村(里水镇)-里水车站-沿江公园-流潮路口-丰岗-草场-洲村市场-金沙洲路-罗冲围客运站总站(12站)
复制代码
代码如下:
  1. #!/usr/bin/perl -w

  2. $source = "./test.txt";
  3. open(INFILE,"<",$source)
  4.   or die("无法打开$source:$!\n");

  5. while(<INFILE>)
  6. {
  7.   @zd = ();
  8.   chomp();

  9.   if(/去程|回程|单向行驶/)
  10.   {
  11.    ($fx,$zd_all) = split(":",$_);
  12.     @zd = split("-",$zd_all);

  13.     if($fx eq "去程")
  14.     {
  15.       $fx = "下行";
  16.     }
  17.     elsif($fx eq "回程")
  18.     {
  19.       $fx = "上行";
  20.     }
  21.   }
  22.   else
  23.   {
  24.     $lx = $_;
  25.   }

  26.   foreach (@zd)
  27.   {
  28.     print $lx,":",$_,":",$fx,"\n";
  29.   }
  30. }
  31. close(INFILE);
复制代码
输出到文件出现
  1. 广州广佛城巴1线:南?下行
  2. 广州广佛城巴1线:南?上行
复制代码
预计输出是:
  1. 广州广佛城巴1线:南海和顺车站总站(12站):下行
  2. 广州广佛城巴1线:南海和顺车站总站(12站):上行
复制代码
现在用如下脚本,就没有出现这样的情况了
  1. @rem = '--*-Perl-*--
  2. @echo off
  3. if "%OS%" == "Windows_NT" goto WinNT
  4. perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
  5. goto endofperl
  6. :WinNT
  7. if not exist Bus-station-list mkdir Bus-station-list
  8. perl -x -S %0 %*
  9. if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
  10. if %errorlevel% == 9009 echo You do not have Perl in your PATH.
  11. if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
  12. goto endofperl
  13. @rem ';
  14. #!/usr/bin/perl -w
  15. #line 15

  16. use Encode;
  17. open(FILE,"<","dir.txt") or die("err:$!");
  18. while(<FILE>)
  19. {
  20.         chomp($filename = $_);
  21.         open(FILE1,"<","./finish/$filename") or die("err:$!\n");
  22.         open(FILE2,">","./Bus-station-list/$filename") or die("err:$!\n");
  23.         while(<FILE1>)
  24.         {
  25.                 chomp();
  26.                 $len = index($_,":");
  27.                 if($len == -1)
  28.                 {
  29.                         $lx = $_;
  30.                 }
  31.                 elsif($len == 4 or $len == 8)
  32.                 {
  33.                         $tmp_fx = substr($_,0,$len);
  34.                         $tmp_zd_all = substr($_,$len+2);
  35.                         $count = 1;
  36.                         while(($num = index($tmp_zd_all,"-")) != -1)
  37.                         {
  38.                                 $zm = substr($tmp_zd_all,0,$num);
  39.                                 print FILE2 $lx,",",$zm,",","$tmp_fx",",","$count",",",",","\n";
  40.                                 $tmp_zd_all = substr($tmp_zd_all,$num+1);
  41.                                 $count++;
  42.                         }
  43.                
  44.                         $tmp_zd_all =~ s/\((\d)+站\)//;
  45.                         print FILE2 $lx,",",$tmp_zd_all,",","$tmp_fx",",","$count",",",",","\n";
  46.         }
  47.         else
  48.         {
  49.                 print "err:\n";
  50.         }
  51.         }
  52.         close(FILE1);
  53.         close(FILE2);
  54. }
  55. close(FILE);
  56. __END__
  57. :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