2010-05-09 59 views
3

在Windows中有一个common problem:文件名应该转换为本地代码页,然后传递到open()。当然,有可能为此使用Win32::API,但我不希望我的脚本依赖于平台。目前我不得不写下类似的东西:使用文件I/O API和unicode文件名的通用方法是什么?

open IN, "<", encode("cp1251", $filename) or die $!; 

但是有没有任何库,隐藏这些细节?我认为本地代码页可以自动检测,所以我只想传递unicode文件名而忘记了细节。为什么它仍然不在框中?

+0

找到相对的帖子:http://stackoverflow.com/questions/1721807/how-do-i-create-then-use-long-windows-paths-from-perl – 2010-05-09 00:11:51

回答

5

使用只是工作,直到5.8.1,然后Jarkko把它拿出来,并打破-C开关在顶部的恩惠不兼容的变化。这使得Windows成为二等公民,直到今天都让我感到困扰,因为任何其他动态语言都没有这种荒谬的缺陷。也许现在是我们能够听到为更糟糕的变化辩护的好时机。

无论如何,你想PerlIO::fse,但它不是一个完美的解决方案,因为你很快就会发现你自己。

+0

很好的答案,非常感谢。也许你可以链接到'-C'(启用给定的Unicode功能)切换讨论?什么是打破兼容性的原因? – 2010-05-09 14:38:18

+0

http://search.cpan.org/~jhi/perl-5.8.0/pod/perlrun.pod#-C – daxim 2010-05-10 11:41:14

+0

我已经明白了你的观点:'-C'的行为已经发生了巨大的变化,现在呢不能控制宽字符的API设置,所以它不能再作为一个问题的解决方案了(我已经找到了当前选项的完整列表http://perldoc.perl.org/perlrun.html#*-C- [_number /列表_] *)。您是否碰巧知道有关'-C -C'开关新政策的任何讨论主题(比如批评者)? – 2010-05-10 17:57:36

相关问题