2009-11-16 8 views
1

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; 
} 
+2

Quel système d'exploitation et système de fichiers utilisez-vous? –

+2

Pouvez-vous poster le code pour ouvrir les fichiers? Cela peut être très utile pour comprendre le problème. –

+0

@JB, je cours Windows XP (version chinoise simplifiée) et le système de fichiers est NTFS. – Mike

Répondre

6

Si vous

use utf8; 

dans votre script Perl, qui indique simplement perl que la source est en UTF-8. Cela n'affecte pas la manière dont Perl traite le monde extérieur. Activez-vous d'autres fonctionnalités de Perl Unicode?

Avez-vous des problèmes avec tous les noms de fichiers ou seulement certains d'entre eux? Pouvez-vous nous donner quelques exemples, ou un petit script de démonstration? Je n'ai pas un système de fichiers qui code les noms comme GB2312, mais avez-vous essayé d'encoder vos noms de fichiers comme GB2312 avant d'appeler ouvert?

Si vous souhaitez des chaînes spécifiques codées avec un codage spécifique, vous pouvez utiliser le module Encode.Essayez cela avec vos noms de fichiers que vous donnez à open.

+0

@brian, merci pour la réponse. Puis-je laisser Perl d'abord convertir le nom de fichier codé GB2312 en UTF-8 afin qu'il puisse reconnaître le nom du fichier? Je sais comment encoder le contenu du fichier non-utf-8 comme utf-8, mais je n'ai pas pensé à le faire avec le nom du fichier. – Mike

+0

@brian, merci! J'ai finalement résolu le problème. Tu as complètement raison! La solution est exactement comme vous l'avez prévu: encoder les noms de fichiers comme GB2312 avant d'appeler ouvert. – Mike