2

我们公司希望将我们托管的所有网站从 Latin-1 转换为 UTF-8。经过一番谷歌搜索,我们的 Perl 脚本几乎完成了。现在唯一缺少的是 XML 文件。

将 XML 从 Latin-1 转换为 UTF-8 的最佳方法是什么?它有用吗?

我问是因为我们不确定,因为谷歌上的大多数条目都解释了如何做完全相反的事情。甚至有人说 utf8 可能会导致 XML 出现问题。您能就整个 XML 编码问题给我们启发吗?

4

3 回答 3

9

你在转换什么?数据或 XML 标记或其他东西?

我认为您只需将其读取为 Latin-1 并将其重写为 UTF-8,除非您的源代码做了一些非常奇怪的事情。解码和编码发生在文件句柄级别。一旦你在 Perl 中拥有它,它内部就已经是 UTF-8 了。

到目前为止你有什么?你有什么问题?

您的情况是否过于复杂而无法仅使用xmllint

 xmllint --encode utf8 --output filename.xml filename.xml.latin1

如果您使用 XML::Parser,请参阅有关该模块的 Juerd 的 Unicode Advice 。

如果您转换的不仅仅是 XML 文件,iconv可能会有所帮助:

iconv -f ISO-8859-1 -t UTF-8 filename.txt.latin1 > filename.txt
于 2009-11-02T15:28:42.233 回答
7

我会使用xmllint --encode utf8 FILE-NAME,示例:

xmllint --encode utf8 --output test.xml test.xml

将正确地转换test.xml(无论它可能有什么编码)为 UTF-8,包括 XML 序言。

于 2009-11-02T15:49:24.477 回答
1

正如 brian 在 Perl 中提到的其内部 UTF-8。Perl 会转换它,不管你想要与否。

诡计连接到 UTF8 标志,这是一个附加到每个字符串的位标志。对于 XML::Parser 返回的数据,设置了 UTF8 标志。

如果您想摆脱这种行为,请清除 UTF8 标志。您可以这样做的一种方法是:

sub de_utf8 {
    use bytes;
    return "$_[0]";
}

这样,生成的字符串将是与原始字符串相同的字节数据。

编辑:有点偏离 OP 的主题......对不起。

于 2009-11-02T15:42:47.983 回答