【问题标题】:How Does XML::Twig keep_encoding work?XML::Twig keep_encoding 如何工作?
【发布时间】: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 :-)

标签: perl utf-8 xml-twig


【解决方案1】:

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

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

【讨论】:

  • 谢谢,成功了。大多数时候我用 Java 编写代码,所以我忘记了 Perl 不默认为 UTF-8。
  • 这是为了向后兼容,如果 Perl 在第一次获得 unicode 支持时默认以 utf8 打印,它会破坏很多现有代码。还有其他方法可以让它默认输出 utf8,比如 -C 选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多