我有一个xml,编码标签设置为'utf-8'。但是,它实际上是iso-8859-1。
以编程方式,我如何在perl和python中检测到这个?以及如何使用不同的编码进行解码?
在perl中,我试过
$xml = decode('iso-8859-1',$file)
但是,这不起作用。
答案 0 :(得分:4)
错误检测非常棘手,因为随机二进制数据通常代表许多编码中的有效字符串。
在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"?>/;
答案 1 :(得分:1)
无论使用何种语言,一般程序都应该相同:
打开文件,将原始字节读入字符串。
尝试将raw_bytes解码为UTF-8,并选择检查错误或引发异常(如果它是无效的UTF-8)。
成功编码为ISO-8859-1的合理长度的有意义的Unicode文本文件通过此UTF-8测试的可能性非常低(当然除非它是ISO-8859-1的子集的ASCII)和UTF-8)。
如果测试失败,请删除XML声明(如果存在)。前面这个:
<?xml version="1.0" encoding="ISO-8859-1"?>
顺便说一下,您确定您确实拥有ISO-8859-1数据而不是CP1252数据(来自Windows平台)吗?
答案 2 :(得分:1)
当然,不用说,找到并纠正数据损坏的根本原因总是比在事件发生后检测和修复损坏更好。
除此之外,要点的是您的文件不是XML,因此无法使用XML工具修复它。您需要在字符或二进制级别攻击它。正如其他人所说,第1步是检测它是无效的UTF-8;第2步是删除不正确的XML声明并将其替换为正确的声明。这些都不应该特别困难。