Я не говорю о чтении содержимого файла в кодировке utf-8 или не-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, как показано в приведенном выше коде.
Обновить
Сделал, наконец-то сделал :)
Предложение @brian правильное. Я сделал ошибку в приведенном выше коде. Я не вернул закодированное имя файла $file.
Вот решение:
#!perl -w
use autodie;
use Encode;
my $file = "./测试.txt";
$file = encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";
while (<$in>){
print;
}
use utf8;в самом верху, а затем пропустить шагdecode. Прагма utf8 сообщает Perl, что ваш исходный код (включая строковые литералы) уже имеет кодировку UTF-8. - person cjm   schedule 26.11.2009