在Perl中读取文件中断编码

时间:2018-11-17 12:28:11

标签: perl encoding escaping

我有用于在Perl中读取html文件的脚本,它可以工作,但是会破坏编码。

这是我的脚本:

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 :(得分:4)

您使用perl的默认编码打开文件:

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

如果该编码与实际编码不匹配,则Perl可能会错误翻译某些字符。如果您知道编码,请在open模式下指定它:

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

不过,您还没有完成。现在您已经有一个可能已解码的字符串,您想输出它。您再次遇到相同的问题。标准输出文件句柄的编码必须与您要打印到的内容匹配。如果您已经设置了终端设备(或其他设备)以使用UTF-8,则需要实际输出UTF-8。解决该问题的一种方法是使标准文件句柄使用UTF-8

use open qw(:std :utf8);

您有use utf8,但这仅表示程序文件的编码。

我在Learning Perl的后面写了更长的Perl和Unicode入门书。 StackOverflow问题Why does modern Perl avoid UTF-8 by default?有很多好的建议。