Как я могу преобразовать входной файл в кодировку UTF-8 в Perl?

Почему не использование ImageMagick?
Это - вполне стандартный инструмент (например, это - стандартный инструмент, используемый Галереей 2); я никогда не использовал его, однако это имеет интерфейс Python также (или, можно также просто породить команду), и больше всего, должен поддержать информацию EXIF между всем преобразованием.

7
задан brian d foy 19 February 2016 в 08:37
поделиться

2 ответа

Думаю, я неправильно понял ваш вопрос. Я думаю, что вы хотите прочитать файл в кодировке, отличной от UTF-8, а затем поиграть с данными как UTF-8 в своей программе. Это намного проще. После того, как вы прочитали данные в правильной кодировке, Perl внутренне представляет их как UTF-8. Так что просто делайте то, что должны.

Когда вы записываете его обратно, используйте любую кодировку, в которой вы хотите его сохранить. Однако вам не нужно помещать его обратно в файл, чтобы использовать его.


старый ответ

Уровни ввода-вывода Perl только читают данные, если они уже правильно закодированы. Он не будет преобразовывать кодировку за вас. Сообщая open использовать utf8, вы говорите ему, что это уже utf8.

Вы должны использовать модуль Encode , как вы показали (если вы не хотите писать свой собственный I / О слой). Вы можете преобразовать байты в UTF-8 или, если вы знаете кодировку, вы можете преобразовать из одной кодировки в другую. Поскольку похоже, что вы уже знаете кодировку, вам может понадобиться функция from_to () .

Если вы только начинаете работать с Perl и Unicode, воспользуйтесь советом Juerd's Perl Unicode Advice , прежде чем что-либо делать.

5
ответ дан 7 December 2019 в 03:18
поделиться

Уровень: encoding вернет UTF-8, подходящий для использования Perl. То есть perl распознает каждый символ как символ, даже если они состоят из нескольких байтов. В зависимости от того, что вы собираетесь делать с данными дальше, этого может быть достаточно.

Но если вы делаете что-то с данными, когда perl попытается понизить его версию с utf8, вам нужно либо указать perl, чтобы (для Например, выполняя binmode (STDOUT, ": utf8"), чтобы сообщить Perl, что вывод в stdout должен быть utf8), или вам нужно, чтобы Perl обрабатывал ваш utf8 как двоичные данные (интерпретируя каждый байт отдельно и ничего не зная о символах utf8 .)

Для этого все, что вам нужно, это применить дополнительный слой к вашему открытию:

open my $foo, "<:encoding(gb2312):bytes", ...;

Обратите внимание, что вывод следующего будет таким же:

perl -we'open my $foo, "<:encoding(gb2312):bytes", "foo"; $bar = <$foo>; print $bar'
perl -CO -we'open my $foo, "<:encoding(gb2312)", "foo"; $bar = <$foo>; print $bar'

, но в одном случае,

4
ответ дан 7 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: