代码之家  ›  专栏  ›  技术社区  ›  Mike

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

  •  2
  • Mike  · 技术社区  · 15 年前

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

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

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

    3 回复  |  直到 15 年前
        1
  •  9
  •   brian d foy    15 年前

    你在转换什么?数据、XML标记还是其他什么?

    我想你只需要把它读成拉丁语-1,然后重写成UTF-8,除非你的源代码真的有点奇怪。解码和编码在filehandle级别进行。一旦在Perl中有了它,它在内部就已经是UTF-8了。

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

    您的情况是否太复杂,无法单独使用 xmllint ?

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

    Juerd's Unicode Advice 关于那个模块。

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

    iconv -f ISO-8859-1 -t UTF-8 filename.txt.latin1 > filename.txt
    
        2
  •  7
  •   brian d foy    15 年前

    xmllint --encode utf8 FILE-NAME ,样本:

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

    将正确转换 test.xml (不管它有什么编码)到UTF-8,包括XML序言。

        3
  •  1
  •   brian d foy    15 年前

    正如brian提到的,它在Perl中的内部UTF-8。无论您是否需要,Perl都将转换它。

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

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

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

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

    编辑:有点偏离了作品的主题。。。对不起的。