gpt4 book ai didi

perl - 非 Ascii 数据在不同的 Perl 安装下表现不同

转载 作者:行者123 更新时间:2023-12-05 01:07:32 25 4
gpt4 key购买 nike

我有以下脚本,它在我安装的两个不同的 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 还是设置一些特殊的编译标志的问题?

最佳答案

首先,两个输出是等价的。 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(防止 \ 序列的插值和解释)。

关于perl - 非 Ascii 数据在不同的 Perl 安装下表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13481668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com