免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3652 | 回复: 5

perl 编码问题 [复制链接]

论坛徽章:
0
发表于 2014-05-29 09:09 |显示全部楼层
  1. use open ':encoding(utf8)', ':std';
  2. use Encode;
  3. my $path = encode('gbk', 'd:\\tmp');

  4. my @t = `dir  $path`;
  5. print decode('gbk', @t);
复制代码
windows下运行上面代码,显示 d:\tmp目录中的文件(有中文文件),但现在不能正常显示。

1.  脚本的代码环境是utf8的。
2.  判断是`` (系统调用,编码时发生了错误)

请问,那里发生了问题?谢了

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
发表于 2014-05-29 10:20 |显示全部楼层
windows 使用的好象是 GB18030, 并不是 utf8

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
发表于 2014-05-29 11:48 |显示全部楼层
同上~~~~~~~~

论坛徽章:
0
发表于 2014-05-29 12:35 |显示全部楼层
回复 2# q1208c

想修改成这样用着,以后了解了,再说。
  1. use open ':encoding(utf8)', ':std';
  2. use Encode;
  3. my $path;
  4. my @t;
  5. {
  6.      use open ':encoding(cp936)', ':std';
  7.    
  8.      @t = `dir  d:\\tmp`;
  9. }

  10. print "@t";
复制代码
但还是有点字符无法识别:
  1. cp936 "\xA8" does not map to Unicode at D:/workspace/deploy/en.pl line 8.
  2. cp936 "\xB7" does not map to Unicode at D:/workspace/deploy/en.pl line 8.
  3. cp936 "\x95" does not map to Unicode at D:/workspace/deploy/en.pl line 8.
  4. cp936 "\x88" does not map to Unicode at D:/workspace/deploy/en.pl line 8.
  5. cp936 "\xB6" does not map to Unicode at D:/workspace/deploy/en.pl line 8.
  6. cp936 "\x95" does not map to Unicode at D:/workspace/deploy/en.pl line 8.
  7. 驱动�\xA8 D 中的卷是 新加�\xB7
  8.   卷的序列号是 04A0-E370

  9.   d:\tmp 的目�\x95

  10. 2014/05/29  10:59    <DIR>          .
  11. 2014/05/29  10:59    <DIR>          ..

  12.                54 个文�\xB6  3,872,446,456 字节
  13.                 9 个目�\x95 153,571,979,264 可用字节
复制代码

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2014-05-29 22:21 |显示全部楼层
本帖最后由 523066680 于 2014-05-29 22:28 编辑

回复 1# hiwork


有几个细节我发表下个人观点:
1. 'd:\\tmp' 里面没有中文字符,没必要encode
2. 'd:\\tmp' 使用单引号引用,没必要用两个斜杠 'd:\tmp' 或者 "d:\\tmp" 都可以
3. use open ':encoding(utf8)', ':std'; 和 print decode('gbk', @t);
    你要读取的文件列表是Windows命令提供的GBK/GB2312编码字符,
    这些字符原封不动输出到windows的页码为CP936的终端,是能够正常显示的。
    唯一需要转码的地方,是当你在脚本中指定的路径含有中文的时候。

  1. my $path = 'D:\x';

  2. my @t = `dir $path`;
  3. print @t;

复制代码
输出结果(文件名亮了呵呵……)
驱动器 D 中的卷是 Dpan
卷的序列号是 6C97-9E44

D:\x 的目录

2014-05-29  15:54    <DIR>          .
2014-05-29  15:54    <DIR>          ..
2014-02-07  18:38         1,606,638 10大下马[和谐]合集.torrent
2014-05-08  22:34            38,912 2007-12-16 根据座标求任意多边形面积.xls



以utf8格式保存的脚本,路径含有中文的时候可以用:
  1. use Encode;
  2. use utf8;
  3. my $path = encode('gbk','D:\驱动');

  4. my @t = `dir $path`;
  5. print @t;
复制代码
或者
  1. use Encode;
  2. my $path = encode('gbk', decode('utf8','D:\驱动'));

  3. my @t = `dir $path`;
  4. print @t;
复制代码

论坛徽章:
0
发表于 2014-05-30 12:53 |显示全部楼层
回复 5# 523066680


    谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP