2

私は次のスクリプトを持っていますが、これは私が持っている2つの異なるPerlインストールで異なる動作をします。1つはPerl5.8.5で、もう1つはPerl5.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をアップグレードするだけの問題ですか、それとも特別なコンパイルフラグを設定するだけの問題ですか?

4

1 に答える 1

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を台無しにするのを防ぎます(\シーケンスの補間と解釈を防ぎます)。

于 2012-11-20T20:42:43.180 に答える