Kann es mit einem utf8-codierten Perl-Skript einen Dateinamen öffnen, der als GB2312 codiert ist?

Ich spreche nicht über das Lesen des Dateiinhalts in utf-8 oder Nicht-utf-8-Codierung und so. Es geht um Dateinamen. Normalerweise speichere ich mein Perl-Skript in der Standardcodierung des Systems, in meinem Fall "GB2312", und es treten keine Probleme beim Öffnen von Dateien auf. Aber zu Verarbeitungszwecken habe ich jetzt einige Perl-Skriptdateien in UTF-8-Codierung gespeichert. Das Problem ist: Diese Skripte können keine Dateien öffnen, deren Namen aus Zeichen bestehen, die in der Kodierung "GB2312" kodiert sind, und ich mag die Idee, meine Dateien umbenennen zu müssen, nicht.

Hat jemand Erfahrung mit solchen Situationen? Vielen Dank wie immer für jede Anleitung.

Bearbeiten

Hier ist der minimierte Code, um mein Problem zu demonstrieren:

# I'm running ActivePerl 5.10.1 on Windows XP (Simplified Chinese version)
# The file system is NTFS

#!perl -w
use autodie;

my $file = "./测试.txt"; #the file name consists of two Chinese characters
open my $in,'<',"$file";

while (<$in>){
print;
}

Dieses Testskript kann gut ausgeführt werden, wenn es in "ANSI" -Codierung gespeichert ist (ich gehe davon aus, dass die ANSI-Codierung mit GB2312 identisch ist, mit der chinesische Zeichen angezeigt werden). Es funktioniert jedoch nicht, wenn es als "UTF-8" gespeichert wird und die Fehlermeldung wie folgt lautet:

Can't open './娴嬭瘯.txt' for reading: 'No such file or directory'.

In dieser Warnmeldung sind "娴 嬭 瘯" bedeutungslose Junk-Zeichen.

Aktualisieren

Ich habe versucht, den Dateinamen zuerst als GB2312 zu codieren, aber es scheint nicht zu funktionieren :( Folgendes habe ich versucht:

#!perl -w
use autodie;
use Encode;

my $file = "./测试.txt";
encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";

while (<$in>){
print;
}

Mein aktueller Gedanke ist: Der Dateiname in meinem Betriebssystem ist 测试 .txt, aber er ist als GB2312 codiert. Im Perl-Skript sieht der Dateiname für menschliche Augen gleich aus, immer noch 测试 .txt. Für Perl sind sie jedoch unterschiedlich, da sie unterschiedliche interne Darstellungen haben. Aber ich verstehe nicht, warum das Problem weiterhin besteht, wenn ich meinen Dateinamen in Perl bereits in GB2312 konvertiert habe, wie im obigen Code gezeigt.

Aktualisieren

Ich habe es geschafft, endlich geschafft :)

@ brians vorschlag ist richtig. Ich habe einen Fehler im obigen Code gemacht. Ich habe den verschlüsselten Dateinamen nicht an die $ -Datei zurückgegeben.

Hier ist die Lösung:

#!perl -w
use autodie;
use Encode;

my $file = "./测试.txt";
$file = encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";

while (<$in>){
print;
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage