Может ли скрипт Perl в кодировке utf8 открыть файл с кодировкой GB2312? - PullRequest
1 голос
/ 16 ноября 2009

Я не говорю о чтении содержимого файла в кодировке 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;
}

1 Ответ

6 голосов
/ 16 ноября 2009

Если вы

 use utf8;

в вашем скрипте Perl, который просто говорит Perl, что источник находится в UTF-8. Это не влияет на то, как Perl взаимодействует с внешним миром. Включаете ли вы какие-либо другие функции Perl Unicode?

У вас проблемы с каждым именем файла или только с некоторыми из них? Можете ли вы привести несколько примеров или небольшой демонстрационный скрипт? У меня нет файловой системы, которая кодирует имена как GB2312, но вы пробовали кодировать свои имена файлов как GB2312 перед тем, как вызывать open?

Если вы хотите, чтобы определенные строки кодировались с определенной кодировкой, вы можете использовать модуль Encode . Попробуйте это с вашими именами файлов, которые вы даете open.

...