XML :: Twig keep_encoding如何工作?

时间:2013-10-30 17:53:02

标签: perl utf-8 xml-twig

在很久以前,我发现了一些Perl在线,当它是一个单行时,它整齐地格式化了有效的XML(标签和换行符)。代码如下。

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

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

根据perldoc for keep_encoding

  

这是一个(略有?)邪恶的选择:如果XML文档不是UTF-8   编码,你想保持这种方式,然后设置keep_encoding   将使用theExpat 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;

1 个答案:

答案 0 :(得分:5)

没有你的数据很难测试,但我猜这是因为Perl将文件打印为ISO-8859-1文件,因为它没有关于其编码的任何信息(它得到它“原始” “来自XML :: Parser)。在打印之前尝试binmode STDOUT, ':utf8';

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