繁体   English   中英

更正XML编码

[英]Correcting the XML encoding

我有一个xml,编码标签设置为'utf-8'。 但是,它实际上是iso-8859-1。

以编程方式,我如何在perl和python中检测到这个? 以及如何使用不同的编码进行解码?

在perl中,我试过了

$xml = decode('iso-8859-1',$file)

但是,这不起作用。

由于随机二进制数据通常代表许多编码中的有效字符串,因此检测错误是非常棘手的。

在Perl中,您可以尝试的最简单的方法是尝试将其解码为utf-8并检查故障。 (它只能以这种方式工作; utf-8编码的西方文档几乎总是一个有效的iso-8859-1文档)

my $xml = eval { decode_utf8( $file, FB_CROAK ) };
if ( $@ ) { is_probably_iso-8859-1_instead }

现在你已经发现了问题,你必须解决它。 这很可能取决于您正在使用的解析器库,但某些泛型应该适用。

如果没有XML声明或MIME类型,将使用Perl本机编码,因此您复制的代码应该可以解决问题。

如果存在错误的XML声明,您可以使用XML解码库提供的任何工具覆盖它,或者在交付之前手动替换它。

# assuming it's on line 1:
$contents =~ s/.*/<?xml version="1.0" encoding="ISO-8859-1"?>/;

无论使用何种语言,一般程序都应该相同:

打开文件,将原始字节读入字符串。

尝试将raw_bytes解码为UTF-8,其中包含检查错误的选项或如果它不是有效的UTF-8则引发异常。

成功编码为ISO-8859-1的合理长度的有意义的Unicode文本文件通过此UTF-8测试的可能性非常低(除非它是ASCII,它是ISO-8859-1和UTF-的子集 - 8)。

如果测试失败,则删除XML声明(如果存在)。 前置这个:

<?xml version="1.0" encoding="ISO-8859-1"?>

那么,您确定您确实拥有ISO-8859-1数据而不是CP1252数据(来自Windows平台)吗?

当然,不用说,找到并纠正数据损坏的根本原因总是比在事件发生后检测和修复损坏更好。

除此之外,要说明的是,您的文件不是XML,因此您无法使用XML工具进行修复。 您需要在字符或二进制级别攻击它。 正如其他人所说,第1步是检测它是无效的UTF-8; 第2步是删除不正确的XML声明并将其替换为正确的声明。 这些都不应该特别困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM