XML :: Twig keep_encoding如何工作?

mat*_*ake 4 perl utf-8 xml-twig

在几年前,我发现了一些Perl online,它在单行时整齐地格式化了有效的XML(标签和换行符).代码如下.

它使用XML :: Twig来做到这一点.它创建XML ::嫩枝对象而不 keep_encoding( $twig = XML::Twig->new()),但如果我给它在它的非ASCII字符UTF-8编码的XML文件时,它产生一个文件,该文件是不是有效根据isutf8命令上UTF-8 Ubuntu Linux系统.在xxd中打开文件,我可以看到字符从2字节变为1.

如果我使用我$twig= XML::Twig->new(keep_encoding=>1);的相同输入产生有效的UTF-8并保留两个字节.

根据Perldoc的keep_encoding

这是一个(稍微?)邪恶的选项:如果XML文档不是UTF-8编码并且你想保持这种方式,那么设置keep_encoding将使用Expat original_string方法作为字符,从而保持原始编码,以及字符串中的原始实体.

为什么在没有该选项的情况下生成非UTF-8文档,为什么设置它会导致保留UTF-8-ness?

顺便说一下,非ASCII字符是一个不间断的空格(c2 a0).

use strict;
use warnings;
use XML::Twig;
my  $sXML  = join "", (<>);
my  $params = [qw(none nsgmls nice indented record record_c)];
my  $sPrettyFormat  = $params->[3] || 'none';
my $twig = XML::Twig->new();
$twig->set_indent(" "x4);
$twig->parse( $sXML );
$twig->set_pretty_print( $sPrettyFormat );
$sXML      = $twig->sprint;
print $xXML;
Run Code Online (Sandbox Code Playgroud)

mir*_*rod 5

没有你的数据很难测试,但我猜这是因为Perl将文件打印为ISO-8859-1文件,因为它没有关于其编码的任何信息(它从XML中获取它"原始") ::分析器).binmode STDOUT, ':utf8';打印前尝试.

此外,首先读取文件然后将字符串传递给解析器可能不是一个好主意.使用parsefile(在文件名上)更安全.您可能会避免编码问题.