免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3604 | 回复: 8
打印 上一主题 下一主题

请教!perl处理中文出现部分乱码 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-06-19 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-21 18:48 |只看该作者 |倒序浏览
大家好!
我用perl处理文本文件,文本有20000多行,处理的结果绝大部分中文正确,只有几行出现乱码,请问这是怎么回事?
文本脚本都是ANSI格式的。

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
2 [报告]
发表于 2010-06-21 18:58 |只看该作者
这样提问,我觉得谁也帮不了你。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-06-19 06:20:00
3 [报告]
发表于 2010-06-21 19:15 |只看该作者
那请问一下大家有没遇到过这样的问题呢?只有一小部分出现了乱码
手头上没有代码,等会贴上来

论坛徽章:
0
4 [报告]
发表于 2010-06-21 19:22 |只看该作者
encode吧
还有的情况就是原始文件的编码就很奇怪
我前几天在解析一个svg的时候,使用了各种编码解析出来都不对,最后我用UE把原始SVG的编码改成了ANSI/ASCII,然后用ISO-8859-1解出来又对了,但是在excel打开时还是乱码,UE和其他编辑器正常

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
5 [报告]
发表于 2010-06-21 21:56 |只看该作者
把perl代码和乱码的文字贴出来看看?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-06-19 06:20:00
6 [报告]
发表于 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
复制代码

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-06-19 06:20:00
7 [报告]
发表于 2010-06-23 13:24 |只看该作者
中间尝试过用Encode,但是还是出现以上情况

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-06-19 06:20:00
8 [报告]
发表于 2010-06-23 13:26 |只看该作者
第17行use Encode;忘了删去了

论坛徽章:
0
9 [报告]
发表于 2010-06-23 14:54 |只看该作者
这个问题是这一句导致的:
($fx,$zd_all) = split(":",$_);

split用全角字符来分隔,是可能会出问题的,有两种解决办法:
1.将数据文件中的全角冒号换成半角冒号,split(":",$_);;
2.用匹配代替split:($fx,$zd_all) = ($_ =~ /(.*?):(.*)/),不需要改数据文件
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP