上个世纪以前,我发现了一些在线的Perl,当它是一个单线时,它整齐地格式化了有效的XML(制表符和换行符)。代码如下。XML :: Twig如何keep_encoding工作?
它使用XML :: Twig来做到这一点。它创建XML :: Twig对象而不是 keep_encoding($twig = XML::Twig->new()
),但是如果我给它一个非ASCII字符的UTF-8编码的XML文件,它会生成一个文件,它是而不是有效的UTF-8到Ubuntu上的isutf8命令。打开xxd中的文件,我可以看到字符从2字节变为1.
如果我使用我的$twig= XML::Twig->new(keep_encoding=>1);
,相同的输入会生成有效的UTF-8并保留两个字节。
按照的Perldoc的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;
这里实际上有两件事:XML :: Twig生成什么,然后保存在文件中。 XML :: Twig在perl的内存中产生$ sXML,但与将它保存在文件中无关。 –
谢谢@briandfoy。我会让你现在回到掌握Perl :-) –