如何将非 UTF-8 格式的 xml 文件转换为 UTF-8 兼容的 xml

Posted

技术标签:

【中文标题】如何将非 UTF-8 格式的 xml 文件转换为 UTF-8 兼容的 xml【英文标题】:How to convert xml file which is in non UTF-8 format to xml that is UTF-8 compliant 【发布时间】:2011-09-14 06:20:41 【问题描述】:

我有一个巨大的 xml 文件,其示例数据如下:

 <vendor name="aglaia"><br>
              <vendorOUI oui="000B91" description="Aglaia Gesellschaft für Bildverarbeitung ud Kommunikation m" /><br>
         </vendor><br>
         <vendor name="ag"><br>
              <vendorOUI oui="0024A9" description="Ag Leader Technology" /><br>
         </vendor><br>

可以看到,有文本“Gesellschaft für Bildverarbeitung”不符合 UTF-8,因为我从 xml 验证器收到错误,错误如下:

导入失败: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:1 字节 UTF-8 序列的字节 1 无效。

那么查询是如何在 Linux 环境中处理这个以将 xml 文件转换为 UTF-8 兼容格式?或者在 bash 中是否有一种方法可以在首先创建 xml 时确保所有变量/字符串都以符合 UTF-8 的格式存储?

【问题讨论】:

当前 XML 标头是否指定编码? IE。是否有这样的标题:&lt;?xml version="1.0" encoding="UTF-8"?&gt;,如果有,编码是什么?如果文件没有这个头,你知道实际编码吗? 这是我的脚本在创建 xml 时添加的标头,但正如我所说,它只是回显到 xml:: 真正的问题是生成的 XML 是否有效,基于此您必须更改 XML 生成器或使用能够处理有效编码的通用 XML 解析库。 【参考方案1】:

使用字符集转换工具:

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

见gnu-page

...在文件http://standards.ieee.org/develop/regauth/oui/oui.txt“aglia”(如您上面的示例中)报告为:

00-0B-91   (hex)            Aglaia Gesellschaft für Bildverarbeitung und Kommunikation m
000B91     (base 16)        Aglaia Gesellschaft für Bildverarbeitung und Kommunikation m
                            Tiniusstr. 12-15
                            Berlin  D-13089
                            GERMANY

似乎“ü”是被毁坏的角色。

更新

使用 wget 下载“oui.txt”时,我在文件中看到字符“ü”。如果你没有那个东西在你的下载中被破坏了。考虑使用其中之一:

wget --header='Accept-Charset: utf-8' 尝试改用curl -o oui.txt

如果以上都不起作用,只需在您喜欢的浏览器中打开链接并执行“另存为”。在这种情况下,请在下面的脚本中注释 wget 行。

我成功使用了以下脚本(更新 BEGIN 和 END 以获取有效的 XML 文件)

#!/bin/bash

wget http://standards.ieee.org/develop/regauth/oui/oui.txt
iconv -f iso-8859-15 -t utf-8 oui.txt > converted

awk 'BEGIN 
         print "html-header"
     

     /base 16/ 
         printf("<vendor name=\"%s\">\n", $4)
         read
         desc = substr($0, index($0, $4))
         printf("<vendorOUI oui=\"%s\" description=\"%s\"/>\n", $1, desc)
     
     END 
         print "HTML-footer"
    
    ' converted

希望这会有所帮助!

【讨论】:

假设当前代码页是 ISO-8859-1,但它可能不是。 @Nosib file filename.txt 输出什么? @Fredrik:我有一个文件 vendor.xml,我不确定它的编码必须转换为符合 UTF-8 标准的文件,所以根据您的建议,我的用法是 iconv -f ISO -8859-1 -t UTF-8 vendor.xml 希望能回答你的问题 编码格式也是standards.ieee.org/develop/regauth/oui/oui.txt中使用的,因为我的基本输入文件就是这个。那么我们可以找出这里使用的编码格式吗? 除非您知道文件现在采用什么编码,否则无法将其转换为 uft-8。您需要了解生成它的人员或程序,并找出有效的编码。如果真的是 8859-1,很好。如果你只是猜测它是 8859-1 而你猜错了,那你就搞砸了。

以上是关于如何将非 UTF-8 格式的 xml 文件转换为 UTF-8 兼容的 xml的主要内容,如果未能解决你的问题,请参考以下文章

将非 ASCII 字符从 ASCII-8BIT 转换为 UTF-8

XML文件编码格式“utf-8”VS“UTF-8”?

java中如何自定义xml文件中的xml格式

java实现将文件格式转换为UTF-8?

如何直接将代码应用于a中的所有文件并将xml文件转换为txt文件

Java:将格式化的xml文件转换为一行字符串