我有一个编码标记设置为“utf-8”的 xml。但是,它实际上是 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 native 编码,因此您复制的代码应该可以解决问题。
如果有错误的 XML 声明,您可以使用 XML 解码库提供的任何工具覆盖它,或者在移交之前手动替换它。
# assuming it's on line 1:
$contents =~ s/.*/<?xml version="1.0" encoding="ISO-8859-1"?>/;
关于python - 更正 XML 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4674835/