Ich hatte das gleiche Problem in einem Projekt vor ein paar Jahren zurück (unsere PAR-gepackte GUI-App musste unter Shift-JIS-Codierung arbeiten). Ich habe viele Techniken ausprobiert, um Perl 5.8 das automatisch richtig machen zu lassen. Am Ende war meine langwierige, aber effektive Lösung, JEDEN Dateinamen zu verschlüsseln, bevor er an die eingebauten Dateien übergeben wurde.
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;
}
Dann verwenden Sie es überall:
Zuerst die Nutzenfunktion einrichten
next if (! -d encode_filename($tmpldir));
my $file = SWF::File->new(encode_filename($dest));
@entries = File::Slurp::read_dir(encode_filename($srcdir));
etc...
ich sogar ein wenig checker, um sicherzustellen, schrieb habe ich es überall!
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)'
Wenn Sie auch nur eine verpassen, werden Sie die „Wide-Zeichen“ zur Laufzeit Warnung erhalten ...
Ihr Code-Snippet hat ein Problem: Sie wollen "\\ text.txt" nicht "\ text.txt". Dies ist jedoch wahrscheinlich nicht dein endgültiges Problem. – Leolo