2012-11-20 25 views
2

我有以下腳本,它們在我擁有的兩個不同的Perl安裝上行爲不同。一個是Perl 5.8.5,另一個是Perl 5.8.8。非ASCII數據的行爲與不同的Perl安裝不同

下面是腳本:

#!/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 ([email protected]) { 
    die "Error: [email protected]"; 
} 

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,或設置一些特殊的編譯標誌?

+0

看來XML :: LibXML的版本不同(大多數系統都爲每個版本的Perl分別保存模塊)。在兩種環境中查看'$ XML :: LibXML :: VERSION'變量。 – PSIAlt

回答

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(防止插值和整型序列的錯誤解釋\)。

+0

我採納了你的建議並得到了有趣的結果。在5.8.8機器上,我得到了libXML = 1.58和libxml2 2.6.26。在5.8.5機器上,我得到了libXML = 1.69和libxml2 2.6.16。所以這聽起來像是底層的libxml2可能是「罪魁禍首」,因爲它是libxml2的早期版本。 – egilchri

+0

但是,也許我不應該把它看作是「罪魁禍首」,因爲如你所說,XML同樣有效。 – egilchri