gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:06:45 29 4
gpt4 key购买 nike

很久以前,我在网上发现了一些 Perl,当它是单行时,它可以整齐地格式化有效的 XML(制表符和换行符)。代码如下。

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

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

根据keep_encoding的Perldoc

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 (在文件名上)更安全。您可能会避免编码问题。

关于perl - XML::Twig keep_encoding 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19690327/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com