几年前,我在网上发现了一些Perl,当它是一行时,它可以整齐地格式化有效的XML(制表符和换行符)。代码如下。
它使用XML::Twig来实现这一点。它创建XML::Twig对象
没有
保持编码(_E)(
$twig = XML::Twig->new()
)但是,如果我给它一个UTF-8编码的XML文件,其中包含一个非ASCII字符,它会生成一个文件
不
根据Ubuntu上的isutf8命令,使用有效的UTF-8。打开xxd中的文件,我可以看到字符从2字节变为1。
如果我使用我的
$twig= XML::Twig->new(keep_encoding=>1);
相同的输入产生有效的UTF-8,并保留两个字节。
根据保持编码的Perldoc
如果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;