代码之家  ›  专栏  ›  技术社区  ›  matt freake

XML::Twig keep_encoding是如何工作的?

  •  4
  • matt freake  · 技术社区  · 11 年前

    几年前,我在网上发现了一些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;
    
    1 回复  |  直到 11 年前
        1
  •  5
  •   mirod    11 年前

    没有数据很难进行测试,但我想这是由于Perl将文件打印为ISO-8859-1文件,因为它没有任何关于编码的信息(它从XML::Parser中获得“原始”)。尝试 binmode STDOUT, ':utf8'; 打印之前。

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