У меня была такая же проблема в проекте несколько лет назад (наше GUI-приложение, упакованное в PAR, должно было работать в кодировке 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)'
Если вы пропустите хотя бы одну, выполучить предупреждение «Широкий символ» во время выполнения ...