Con un script Perl codificado en utf8, ¿puede abrir un nombre de archivo codificado como GB2312?
No estoy hablando de leer el contenido del archivo en codificación utf-8 o no-utf-8 y demás. Se trata de nombres de archivos. Por lo general, guardo mi script Perl en la codificación predeterminada del sistema, "GB2312" en mi caso y no tendré ningún problema de apertura de archivos. Pero para fines de procesamiento, ahora tengo algunos archivos de script Perl guardados en codificación utf-8. El problema es que estos scripts no pueden abrir los archivos cuyos nombres consisten en caracteres codificados en la codificación "GB2312" y no me gusta la idea de tener que cambiar el nombre de mis archivos.
¿Alguien tiene alguna experiencia en el manejo de este tipo de situaciones? Gracias como siempre por cualquier orientación.
Editar
Aquí está el código minimizado para demostrar mi problema:
# 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;
}
Este script de prueba puede ejecutarse bien si se guarda en la codificación "ANSI" (supongo que la codificación ANSI es la misma que la GB2312, que se usa para mostrar los caracteres chinos). Pero no funcionará si se guarda como "UTF-8" y el mensaje de error es el siguiente:
Can't open './娴嬭瘯.txt' for reading: 'No such file or directory'.
En este mensaje de advertencia, "娴 嬭 瘯" son caracteres basura sin sentido.
Actualizar
Primero intenté codificar el nombre del archivo como GB2312, pero parece que no funciona :( Esto es lo que intenté:
#!perl -w
use autodie;
use Encode;
my $file = "./测试.txt";
encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";
while (<$in>){
print;
}
Mi idea actual es: el nombre del archivo en mi sistema operativo es t .txt pero está codificado como GB2312. En el script de Perl, el nombre del archivo se ve igual a los ojos humanos, aún .txt. Pero para Perl, son diferentes porque tienen diferentes representaciones internas. Pero no entiendo por qué el problema persiste cuando ya convertí mi nombre de archivo en Perl a GB2312 como se muestra en el código anterior.
Actualizar
Lo hice, finalmente lo hice :)
La sugerencia de @Brian es correcta. Cometí un error en el código anterior. No devolví el nombre del archivo codificado al archivo $.
Aquí está la solución:
#!perl -w
use autodie;
use Encode;
my $file = "./测试.txt";
$file = encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";
while (<$in>){
print;
}