代码之家  ›  专栏  ›  技术社区  ›  tomsk

读取文件会中断Perl中的编码

  •  0
  • tomsk  · 技术社区  · 6 年前

    我有用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 回复  |  直到 6 年前
        1
  •  4
  •   brian d foy    6 年前

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

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

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

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

    不过,你还没有完成。既然您有了一个可能已解码的字符串,那么就需要输出它。你又遇到了同样的问题。标准输出文件句柄的编码必须与您要打印到的内容相匹配。如果您已经将终端设置为期望UTF-8,那么实际上需要输出UTF-8。解决这个问题的一种方法是使用标准的文件句柄 UTF-8 :

    use open qw(:std :utf8);
    

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

    我在后面为Perl和Unicode编写了一个更长的初级读物。 Learning Perl . stackoverflow问题 Why does modern Perl avoid UTF-8 by default? 有很多好的建议。