非Ascii数据在不同的Perl安装中表现不同

时间:2012-11-20 20:36:12

标签: perl utf-8

我有以下脚本,它在我拥有的两个不同的Perl安装上表现不同。一个是Perl 5.8.5,另一个是Perl 5.8.8。

这是脚本:

#!/usr/bin/perl

use FindBin(qw($Bin));

use lib $Bin;
use lib "$Bin/../lib";


use XML::LibXML;

use strict;    # quote strings, declare variables
use warnings;  # on by default
use warnings  qw(FATAL utf8);    # fatalize encoding glitches
use open      qw(:std :utf8);    # undeclared streams in UTF-8


my $xml =<<EOS;
<?xml version="1.0" encoding="UTF8"?>
<foo>Привет, мир!</foo>
EOS

my $parser = new XML::LibXML;


my $doc = '';
eval { $doc = $parser->parse_string($xml); };

if ($@) {
    die "Error: $@";
} 

my $root = $doc->getDocumentElement();

print "XML after parsing: ", $root->toString(), "\n";

在我的5.8.8 Perl安装中,我得到了:

XML after parsing: <foo>Привет, мир!</foo>

在我的5.8.5 Perl安装中,我得到了:

XML after parsing: <foo>&#x41F;&#x440;&#x438;&#x432;&#x435;&#x442;, &#x43C;&#x438;&#x440;!</foo>

我希望我的5.8.5安装在这方面表现得像5.8.8。这只是升级我的Perl,还是设置一些特殊的编译标志?

1 个答案:

答案 0 :(得分:6)

首先,两个输出都是等价的。 XML :: LibXML可以自由生成任何一个,它对接收解析器无关紧要。当然,XML被认为是人类可读的,这可能与您有关。

不,XML :: LibXML没有控制它转义的字符的选项。事实上,我只知道它只在需要时逃脱,这是第一种行为。

无需升级Perl。升级XML :: LibXML或libxml2(XML :: LibXML使用的底层库)将起到作用。

# XML::LibXML's version
>perl -MXML::LibXML -E"say $XML::LibXML::VERSION"
1.70

# libxml2's version
>perl -MXML::LibXML -E"say XML::LibXML::LIBXML_DOTTED_VERSION"
2.7.7

离题提示:

  1. 我假设您的源代码是使用UTF-8编码的?如果是这样,我会添加use utf8;让Perl知道。如果你这样做,你需要改变

    my $xml = <<EOS;
    

    my $xml = encode_utf8(<<EOS);
    
  2. 使用

    <<'EOI'
    

    而不是

    <<EOI
    

    将阻止Perl弄乱您的XML(防止插入和解释\序列)。