幾年前,我在一個項目中遇到了同樣的問題(我們的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