Я не говорю о чтении содержимого файла в кодировке utf-8 или non-utf-8 и прочем. Речь идет об именах файлов. Обычно я сохраняю свой Perl-скрипт в системной кодировке по умолчанию, в моем случае, «GB2312», и у меня не возникает проблем с открытием файлов. Но теперь для обработки у меня есть некоторые файлы сценариев Perl, сохраненные в кодировке utf-8. Проблема в том, что эти сценарии не могут открывать файлы, имена которых состоят из символов, закодированных в кодировке "GB2312", и мне не нравится идея переименования моих файлов.
Есть ли у кого-нибудь опыт работы с подобной ситуацией? Спасибо, как всегда за любые указания.
Редактировать
Вот свернутый код, чтобы продемонстрировать мою проблему:
# 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;
}
Этот тестовый скрипт может хорошо работать, если он сохранен в кодировке "ANSI" (я предполагаю, что кодировка ANSI такая же, как и в GB2312, который используется для отображения китайских символов). Но он не будет работать, если сохранен как «UTF-8», а сообщение об ошибке выглядит следующим образом:
Can't open './娴嬭瘯.txt' for reading: 'No such file or directory'.
В этом предупреждающем сообщении "娴 嬭 瘯" - бессмысленные ненужные символы.
Обновление
Я попытался сначала кодировать имя файла как GB2312, но, похоже, оно не работает :(
Вот что я попробовал:
#!perl -w
use autodie;
use Encode;
my $file = "./测试.txt";
encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";
while (<$in>){
print;
}
В настоящее время я думаю: имя файла в моей ОС - 测试 .txt, но оно закодировано как GB2312. В сценарии Perl имя файла выглядит одинаково для человеческого глаза, но все равно 测试 .txt. Но для Perl они разные, потому что у них разные внутренние представления. Но я не понимаю, почему проблема сохраняется, когда я уже преобразовал свое имя файла в Perl в GB2312, как показано в приведенном выше коде.
Обновление
Я сделал это, наконец сделал это:)
@ Предложение Брайана верно. Я сделал ошибку в приведенном выше коде. Я не вернул закодированное имя файла в $ file.
Вот решение:
#!perl -w
use autodie;
use Encode;
my $file = "./测试.txt";
$file = encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";
while (<$in>){
print;
}