如何将非UTF-8格式的XML文件转换为符合UTF-8标准的XML文件

5
我有一个巨大的 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: Invalid byte 1 of 1-byte UTF-8 sequence.
因此问题是如何在Linux环境下处理这个问题,将xml文件转换为UTF-8兼容格式?或者在第一次创建xml时是否有办法确保所有变量/字符串以UTF-8兼容格式存储?

1
当前的XML头是否指定了编码?即是否有这样的头文件:<?xml version="1.0" encoding="UTF-8"?>,如果是,那么编码是什么?如果文件没有此头文件,你知道实际的编码吗? - Jim Garrison
这是我的脚本在创建 XML 时添加的标题,但正如我所说的那样,它只是回显到 XML 中: <?xml version="1.0" encoding="UTF-8"?> <vendors> - Nohsib
真正的问题是生成的XML是否有效,基于此,您必须更改XML生成器或使用通用的XML解析库来处理有效编码。 - sorin
1个回答

5
使用字符集转换工具:
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

希望这能帮到你!

1
假设当前代码页是ISO-8859-1,但实际上可能并非如此。 - Jim Garrison
@Nosib file filename.txt 输出什么? - Fredrik Pihl
@Fredrik:我有一个文件vendor.xml,我不确定它的编码方式,需要将其转换为UTF-8兼容的文件。根据您的建议,我的使用方法是iconv -f ISO-8859-1 -t UTF-8 vendor.xml。希望这回答了您的问题。 - Nohsib
编码格式也是在http://standards.ieee.org/develop/regauth/oui/oui.txt中使用的,因为我的基本输入文件就是这个。那么我们能找出这里使用的编码格式吗? - Nohsib
文件发布在http://standards.ieee.org/develop/regauth/oui/oui.txt,那么有什么选择呢?因为我怀疑他们不会回复,尽管我已经给他们发了邮件。是否有其他选择? - Nohsib
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接