Je ne parle pas de lire dans le contenu du fichier dans l'encodage utf-8 ou non-utf-8 et d'autres choses. Il s'agit de noms de fichiers. Habituellement, je sauvegarde mon script Perl dans l'encodage par défaut du système, "GB2312" dans mon cas et je n'aurai aucun problème d'ouverture de fichier. Mais à des fins de traitement, j'ai maintenant des fichiers de script Perl enregistrés en encodage utf-8. Le problème est: ces scripts ne peuvent pas ouvrir les fichiers dont les noms sont constitués de caractères encodés en encodage "GB2312" et je n'aime pas l'idée de devoir renommer mes fichiers.Avec un script Perl encodé en utf8, peut-il ouvrir un nom de fichier codé en tant que GB2312?
Quelqu'un a-t-il de l'expérience dans ce genre de situation? Merci comme toujours pour toute orientation.
Modifier
est ici le code minimisés pour démontrer mon problème:
# 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;
}
Ce script de test peut bien fonctionner si elle est enregistrée dans le codage "ANSI" (je suppose que le codage ANSI est le même que GB2312 , qui est utilisé pour afficher les caractères chinois). Mais il ne fonctionnera pas si enregistré en tant que « UTF-8 » et le message d'erreur est le suivant:
Can't open './娴嬭瘯.txt' for reading: 'No such file or directory'.
Dans ce message d'avertissement, « 娴 嬭 瘯 » sont des caractères indésirables vides de sens.
Mise à jour
J'ai essayé d'abord coder le nom de fichier comme GB2312, mais il ne semble pas fonctionner :( Voici ce que j'ai essayé:
#!perl -w
use autodie;
use Encode;
my $file = "./测试.txt";
encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";
while (<$in>){
print;
}
Ma pensée actuelle est: le nom du fichier dans mon OS est 测试 .txt mais il est codé comme GB2312 Dans le script Perl le nom du fichier est le même pour les yeux humains, encore 测试 .txt Mais pour Perl, ils sont différents car ils ont des représentations internes différentes. ne comprends pas pourquoi le problème persiste quand j'ai déjà converti mon fichier nam e en Perl à GB2312 comme indiqué dans le code ci-dessus.
Mise à jour
je l'ai fait, enfin fait :)
@ suggestion de brian est juste. J'ai fait une erreur dans le code ci-dessus. Je n'ai pas donné le nom de fichier codé au fichier $.
est ici la solution:
#!perl -w
use autodie;
use Encode;
my $file = "./测试.txt";
$file = encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";
while (<$in>){
print;
}
Quel système d'exploitation et système de fichiers utilisez-vous? –
Pouvez-vous poster le code pour ouvrir les fichiers? Cela peut être très utile pour comprendre le problème. –
@JB, je cours Windows XP (version chinoise simplifiée) et le système de fichiers est NTFS. – Mike