python - 更正 XML 编码

标签 python xml perl encoding

我有一个编码标记设置为“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/

相关文章:

perl - 安装 Perl Web 应用程序的最佳系统是什么?

arrays - Perl 语法组合 `foreach` 和 `if` : Shouldn't it work, 即 : Why doesn't it work?

windows - 如何在 perl 中为反引号加载 STDIN(不写入临时文件)

python - 使用依赖图执行 Celery 任务

python - 在 try-except block 中关闭游标后如何关闭连接?

machine-learning - 在java中加载 tensorflow 模型

android - ScrollView 不会完全滚动

python - celery :一次分派(dispatch)很多工作

java - 未调用设置 Activity onCreate()

Java序列化bean到xml