免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6353 | 回复: 10

关于目录和文件名称中有中文的问题 [复制链接]

论坛徽章:
0
发表于 2012-09-26 23:14 |显示全部楼层
使用tk打开目录和文件选择窗口以便选定目录和文件,当名称中有中文时,程序运行遇到编码格式的问题
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use utf8;
  4. use File::Find;
  5. use Tk;

  6. my $mw = MainWindow->new;
  7. my $dirname;  # select dirname

  8. # contain directory items
  9. my $resultLbox = $mw->Listbox->pack;

  10. # select a directory
  11. my $selectDirBt = $mw->Button(-text => 'select dir',
  12.         -command => sub {&select_dir})->pack;

  13. # display your select directory tree into listbox
  14. my $displayResultBt = $mw->Button(-text => 'display dir',
  15.         -command => sub {&display_result})->pack;

  16. MainLoop;

  17. # opening a window for selecting directory
  18. sub select_dir{
  19.         $dirname = $mw->chooseDirectory;
  20. }

  21. # putting directory tree to listbox
  22. sub display_result{
  23.         my @result;
  24.         if ($dirname){
  25.                 find(sub {push (@result, $File::Find::name)}, $dirname);
  26.                 $resultLbox->insert('end', @result);
  27.         }
  28. }
复制代码
点击选择目录按钮,选择一个含有中文名字的路径,然后点击列出目录按钮,后台报错
error msg: Can't stat C:/Users/Administrator/Desktop/C语言: No such file or directory

修改程序,加入Encode模块
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use utf8;
  4. use Encode;
  5. use File::Find;
  6. use Tk;

  7. my $mw = MainWindow->new;
  8. my $dirname;  # select dirname

  9. # contain directory items
  10. my $resultLbox = $mw->Listbox->pack;

  11. # select a directory
  12. my $selectDirBt = $mw->Button(-text => 'select dir',
  13.         -command => sub {&select_dir})->pack;

  14. # display your select directory tree into listbox
  15. my $displayResultBt = $mw->Button(-text => 'display dir',
  16.         -command => sub {&display_result})->pack;

  17. MainLoop;

  18. # opening a window for selecting directory
  19. sub select_dir{
  20.         $dirname = $mw->chooseDirectory;
  21. }

  22. # putting directory tree to listbox
  23. sub display_result{
  24.         my @result;
  25.         if ($dirname){
  26.                 find(sub {push (@result, $File::Find::name)}, decode('utf8', $dirname));
  27.                 $resultLbox->insert('end', @result);
  28.         }
  29. }
复制代码
依然报错
error msg: Can't stat C:/Users/Administrator/Desktop/C锟斤拷锟斤拷: No such file or directory

应该是编码格式的问题,在使用选择文件的时候,遇到的情况和这个类似

希望知道解决方法的朋友可以给我一些指导和建议,上面的代码也可以拷贝测试。
谢谢!

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-09-27 15:21 |显示全部楼层
回复 1# 努力小伙


刚调试快半个小时才发觉这是 Tcl 的 bug, chooseDirectory 返回的明明是 GBK 编码的字符串而 tcl 却把它当作 utf8 处理了,所以即使在 wish 下它也不能用。

先给个比较 dirty 的解决方法:

my @chrs = split //, $dirname;
my $dirname = pack 'C*', map ord($_), @chrs;

论坛徽章:
0
发表于 2012-09-27 16:15 |显示全部楼层
如果在MS的平台,楼主也可以考虑使用Win32::GUI,编码问题比较容易解决。

用Perl搞GUI很头大,Perl如果有一个全新的方便开发的GUI平台就好了。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-09-27 17:30 |显示全部楼层
iamlimeng 发表于 2012-09-27 16:15
如果在MS的平台,楼主也可以考虑使用Win32::GUI,编码问题比较容易解决。

用Perl搞GUI很头大,Perl如果有 ...


听你推荐周末学了下这个模块,之前上 CPAN 看我一直以为它是没有文档的自己下了源代码才 make 出 html 文档来。画图方面没 tk 的 canvas 好用,不过性能很高,搞的我都忍不住写了个 mario 的小 demo

论坛徽章:
0
发表于 2012-09-27 17:59 |显示全部楼层
感谢,通过这样的方式确实可以让tk返回的路径名称供File::Find使用。但是会引起另外的问题,插入到tk面板之前,不再次处理的话,显示的中文变成乱码了,希望还有别的方法来解决这个问题回复 2# zhlong8


   

论坛徽章:
0
发表于 2012-09-27 18:04 |显示全部楼层
thanks,这个模块确实不错的选择,不过现在这个软件的界面比较复杂一些,Tk更合适一点点,实在不行,我会放弃对中文的支持,把时间花在功能实现上回复 3# iamlimeng


   

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-09-27 23:16 |显示全部楼层
努力小伙 发表于 2012-09-27 17:59
感谢,通过这样的方式确实可以让tk返回的路径名称供File::Find使用。但是会引起另外的问题,插入到tk面板之 ...


Tk 默认使用的系统编码是 Latin-1 结果一个中文字就被当两个 ascii 的扩展字符所以需要先设置下编码。这里没有 bug,是我系统中两个 tcl/tk 搞混了。下面只写下 tcl 代码,因为我只有 Tkx 这个模块。

encoding dirs "dir-with cp936.enc" #放有 cp936.enc 的文件夹,下一行会查找并加载这个文件
encoding system cp936

Tkx 中是这样的, Tk 中不知道怎么写。
Tkx::encoding_dirs("dir with cp936.enc");
Tkx::encoding_system('cp936');

那个 cp936.enc 模块应该没带,发你一个 cp936.zip (50.55 KB, 下载次数: 20)

论坛徽章:
0
发表于 2012-09-28 13:55 |显示全部楼层
回复 4# zhlong8

Win32::GUI直接调用系统指令,性能肯定好,还有一大群Win32相关模块可用,一般的应用基本能满足了;用PDK打包后体积非常小,比用TK要小很多。文档确实很少,除了模块自带的,很难找到更详细的。没有辅助开发工具,开发费时费力;写简单的界面玩玩可以,太复杂会累死人的。

若真的要跨平台,高性能,易开发,可以考虑用GTK+,各方面都不错。

至于TK,它就是一头老牛!

论坛徽章:
0
发表于 2012-09-28 15:16 |显示全部楼层
谢谢,这个东西我还不会用,没有找到如何让Tk加载该编码文件的方法,期待您能找到少折腾更给力的解决办法回复 7# zhlong8


   

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2012-09-28 15:36 |显示全部楼层
努力小伙 发表于 2012-09-28 15:16
谢谢,这个东西我还不会用,没有找到如何让Tk加载该编码文件的方法,期待您能找到少折腾更给力的解决办法回 ...


没了,就是那个模块默认设置不是中文 windows,已经是最简。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP