【问题标题】:How to convert xml file which is in non UTF-8 format to xml that is UTF-8 compliant如何将非 UTF-8 格式的 xml 文件转换为 UTF-8 兼容的 xml
【发布时间】: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 解析库。

标签: linux shell unix unicode utf-8


【解决方案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 而你猜错了,那你就搞砸了。
猜你喜欢
  • 2015-09-19
  • 2011-03-16
  • 2012-06-01
  • 2014-08-29
  • 2013-10-10
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2013-04-11
相关资源
最近更新 更多