Почему чтение в файле UTF-16LE не преобразует "\ r \ n" в "\ n" в Windows - PullRequest
1 голос
/ 13 апреля 2010

Я использую Perl для чтения файлов UTF-16LE в Windows 7.

Если я читаю в файле ASCII со следующим кодом, то каждый "\ r \ n" в файле будет преобразован в "\n "в памяти:

open CUR_FILE, "<", $asciiFile; 

Если я читаю в файле UTF-16LE (windows 1200) со следующим кодом, это несоответствие вызывает проблемы, когда я пытаюсь отразить строки с разрывами строк.

open CUR_FILE, "<:encoding(UTF-16LE)", $utf16leFile;

Тогда "\ r \ n" останется без изменений.

Обновление:
Для каждой строки файла UTF-16LE:

line =~ /(.*)$/

Тогда строка, соответствующая $ 1, будет содержать в конце символ "\ r" ...

Ответы [ 2 ]

1 голос
/ 13 апреля 2010

Какую версию Perl вы используете? Обработка UTF-16 и CRLF не смешивалась должным образом до 5.8.9 ( изменения Unicode в 5.8.9 ). Я не уверен насчет 5.10.0, но он работает в 5.10.1 и 5.8.9. Возможно, вам придется использовать "<:encoding(UTF-16LE):crlf" при открытии файла.

0 голосов
/ 13 апреля 2010

Это окна, исполняющие эту магию за вас .... Если вы укажете UTF, это будет эквивалентно открытию файла в двоичном режиме по сравнению с текстом.

Более новые версии Perl имеют \ R, который является общей новой строкой (т.е. будет соответствовать как \ r \ n и \ n), так и \ v, который будет соответствовать всем понятиям ОС и Юникода вертикального пробела (т.е. \ r \ n \ r \ n неразрывный пробел и т. д.)

Позволяет ли логика регулярного выражения использовать \ R вместо \ n?

...