Чтение файловых разрывов кодировки в Perl - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть скрипт для чтения html-файлов в Perl, он работает, но нарушает кодировку.

Это мой скрипт:

use utf8;
use Data::Dumper;

open my $fr, '<', 'file.html' or die "Can't open file $!";
my $content_from_file = do { local $/; <$fr> };

print Dumper($content_from_file);

Содержимое файла file.html:

<span class="previews-counter">Počet hodnotení: [%product.rating_votes%]</span>
<a href="#" title="[%L10n.msg('Zobraziť recenzie')%]" class="previews-btn js-previews-btn">[%L10n.msg('Zobraziť recenzie')%]</a>

Вывод из чтения:

<span class=\"previews-counter\">Po\x{10d}et hodnoten\x{ed}: [%product.rating_votes%]</span>
<a href=\"#\" title=\"[%L10n.msg('Zobrazi\x{165} recenzie')%]\" class=\"previews-btn js-previews-btn\">[%L10n.msg('Zobrazi\x{165} recenzie')%]</a>

Как вы видите, многие символы экранированы, как я могупрочитать этот файл и показать его содержимое как есть?

1 Ответ

0 голосов
/ 17 ноября 2018

Вы открываете файл с кодировкой Perl по умолчанию:

open my $fh, '<', ...;

Если эта кодировка не соответствует фактической кодировке, Perl может неправильно переводить некоторые символы.Если вы знаете кодировку, укажите ее в режиме open:

open my $fh, '<:utf8', ...;

Вы еще не закончили.Теперь, когда у вас есть, вероятно, декодированная строка, вы хотите вывести ее.У вас снова та же проблема.Кодировка дескриптора стандартного выходного файла должна соответствовать тому, что вы пытаетесь распечатать.Если вы настроили свой терминал (или что-то еще) на ожидание UTF-8, вам действительно нужно вывести UTF-8.Один из способов исправить это - заставить стандартные файловые дескрипторы использовать UTF-8:

use open qw(:std :utf8);

У вас есть use utf8, но это только сигнализирует кодировку для вашего программного файла.

I 'Мы написали гораздо более длинный учебник для Perl и Unicode в конце Learning Perl .Вопрос StackOverflow Почему современный Perl по умолчанию избегает UTF-8? дает много полезных советов.

...