几年前,我在一个项目中遇到了同样的问题(我们的PAR包装GUI应用程序必须在Shift-JIS编码下工作)。我尝试了很多技术来让Perl 5.8自动执行此操作。最后,我冗长而有效的解决方案是在将每个文件名传递给内置函数之前对其进行编码。
首先,设置实用功能:
use Encode;
use Win32::Codepage;
my $encoding = Win32::Codepage::get_encoding() || q{};
if ($encoding) {
$encoding = Encode::resolve_alias($encoding) || q{};
}
sub encode_filename {
my ($filename) = @_;
return $encoding ? encode($encoding, $filename) : $filename;
}
然后,用它到处:
next if (! -d encode_filename($tmpldir));
my $file = SWF::File->new(encode_filename($dest));
@entries = File::Slurp::read_dir(encode_filename($srcdir));
etc...
我甚至写了一个小检查,以确保我用它无处不在!
egrep "\-[a-zA-Z] |open[^_]|[^ ]parse|unlink|symlink|mkdir[^_]|mkpath|rename[^\']|File::Copy::copy|rmtree|getTemplate[^D]|write_file|read_file|read_dir" *.pl `find lib -name '*.pm'` | grep -
v encode_filename | egrep -v '^[^:]+: *(\#|_announce|debug)'
如果你错过连一个,你会得到“宽字符”在运行时警告...
你的代码片段有一个问题:你想要“\\ text.txt”而不是“\ text.txt”。这可能不是你最后的问题。 – Leolo 2010-11-21 06:08:30