【发布时间】:2013-10-30 17:53:01
【问题描述】:
很久以前,我在网上发现了一些 Perl,当它是单行时,它整齐地格式化了有效的 XML(制表符和换行符)。代码如下。
它使用 XML::Twig 来做到这一点。它创建 XML::Twig 对象 without keep_encoding ($twig = XML::Twig->new()) 但如果我给它一个 UTF-8 编码的 XML 文件,其中包含非 ASCII 字符,它会生成一个文件 not 是有效的 UTF-8。打开 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 特性被保留?
顺便说一下,非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;
【问题讨论】:
-
这里实际上有两件事:XML::Twig 产生什么,然后你保存在文件中。 XML::Twig 在 perl 的内存中生成 $sXML 但与您将其保存在文件中无关。
-
谢谢@briandfoy。我现在让你回到精通 Perl :-)