加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – XML :: Twig keep_encoding如何工作?

发布时间:2020-12-16 06:17:52 所属栏目:大数据 来源:网络整理
导读:在几年前,我在网上发现了一些Perl,它在单行时整齐地格式化了有效的 XML(标签和换行符).代码如下. 它使用XML :: Twig来做到这一点.它创建了没有keep_encoding的XML :: Twig对象($twig = XML :: Twig- new())但如果我给它一个带有非ASCII字符的UTF-8编码的XML
在几年前,我在网上发现了一些Perl,它在单行时整齐地格式化了有效的 XML(标签和换行符).代码如下.

它使用XML :: Twig来做到这一点.它创建了没有keep_encoding的XML :: Twig对象($twig = XML :: Twig-> new())但如果我给它一个带有非ASCII字符的UTF-8编码的XML文件,它会生成一个文件根据Ubuntu上的isutf8命令,它不是有效的UTF-8.在xxd中打开文件,我可以看到字符从2字节变为1.

如果我使用我的$twig = XML :: Twig-> new(keep_encoding => 1);相同的输入产生有效的UTF-8并保留两个字节.

根据Perldoc的keep_encoding

This is a (slightly?) evil option: if the XML document is not UTF-8
encoded and you want to keep it that way,then setting keep_encoding
will use theExpat original_string method for character,thus keeping
the original encoding,as well as the original entities in the
strings.

为什么在没有该选项的情况下生成非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;

解决方法

没有你的数据很难测试,但我猜这是因为Perl将文件打印为ISO-8859-1文件,因为它没有关于其编码的任何信息(它从XML中获取它“原始”) ::分析器).试试binmode STDOUT,’:utf8′;在打印之前.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读