如何在Perl中将XML文档从Latin-1转换为UTF-8?

时间:2009-11-02 15:24:36

标签: xml perl encoding utf-8 latin1

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

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

我在问,因为我们对此不确定,因为Google上的大多数条目都解释了如何做到完全相反。有人甚至说utf8可能会导致XML出现问题。你能介绍一下整个XML编码问题吗?

3 个答案:

答案 0 :(得分:8)

你在转变什么?数据或XML标签还是别的什么?

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

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

您的情况是否过于复杂,仅仅使用xmllint

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

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

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

iconv -f ISO-8859-1 -t UTF-8 filename.txt.latin1 > filename.txt

答案 1 :(得分:7)

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

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

会正确地将test.xml(无论编码方式)转换为UTF-8,包括XML序言。

答案 2 :(得分:1)

正如布莱恩在Perl中提到的内部UTF-8。无论你是否愿意,Perl都会转换它。

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

如果您想要摆脱这种行为,请清除UTF8标志。你能做到的一种方法是:

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

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

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