我有用于在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>
如您所见,许多字符都转义了,我如何读取此文件并按原样显示其内容?
答案 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?有很多好的建议。