我有以下脚本,它在我拥有的两个不同的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";
Run Code Online (Sandbox Code Playgroud)
在我的5.8.8 Perl安装上,我得到:
XML after parsing: <foo>??????, ???!</foo>
Run Code Online (Sandbox Code Playgroud)
在我的5.8.5 Perl安装上,我得到:
XML after parsing: <foo>Привет, мир!</foo>
Run Code Online (Sandbox Code Playgroud)
我希望我的5.8.5安装在这方面表现得像5.8.8.这只是升级我的Perl,还是设置一些特殊的编译标志?
首先,两个产出都是等价的.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
Run Code Online (Sandbox Code Playgroud)
偏离主题的提示:
我假设你的源代码是用UTF-8编码的?如果是这样,我会添加use utf8;让Perl知道.如果你这样做,你需要改变
my $xml = <<EOS;
Run Code Online (Sandbox Code Playgroud)
至
my $xml = encode_utf8(<<EOS);
Run Code Online (Sandbox Code Playgroud)运用
<<'EOI'
Run Code Online (Sandbox Code Playgroud)
代替
<<EOI
Run Code Online (Sandbox Code Playgroud)
将阻止Perl搞乱你的XML(防止插值和解释\序列).