У меня есть текстовые файлы, которые я пытаюсь преобразовать с помощью Perl-скрипта в Windows. Текстовые файлы выглядят нормально в Notepad +, но все регулярные выражения в моем скрипте не совпадают. Затем я заметил, что когда я открываю текстовые файлы в NotePad +, в строке состояния говорится «UCS-2 Little Endia» (sic). Я предполагаю, что это соответствует кодировке UCS-2LE. Так что я создал «ReadFile» и «WriteFile» подлодку в Perl, например, так:Unicode в Perl не работает
use PerlIO::encoding;
my $enc = ':encoding(UCS-2LE)';
sub readFile {
my ($fName) = @_;
open my $f, "<$enc", $fName or die "can't read $fName\n";
local $/;
my $txt = <$f>;
close $f;
return $txt;
}
sub writeFile {
my ($fName, $txt) = @_;
open my $f, ">$enc", $fName or die "can't write $fName\n";
print $f $txt;
close $f;
}
my $fName = 'someFile.txt';
my $txt = readFile $fName;
# ... transform $txt using s/// ...
writeFile $fName, $txt;
теперь матч регулярных выражений (хотя и менее часто, чем я ожидал), но на выходе содержит длинные строки азиатских выглядящих символов с вкраплениями длинные строки правильного текста. Является ли мой код неправильным? Или, возможно, Notepad + ошибается в кодировании? Как мне продолжить?
Предоставлять тестовые данные, дополнительные шестнадцатеричное этого является хорошей идеей. Покажите * полный * код, который вызывает проблему. Если вы не позволите нам воспроизвести проблему, мы можем только предполагать. – daxim
@ daxim: код здесь достаточно полный, единственная причина, по которой я не могу проверить это, потому что у меня нет редактора блокнота +. Угадайте, это проблема спецификации. – 2010-07-22 08:00:59