如何将非 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。是否有这样的标题:<?xml version="1.0" encoding="UTF-8"?>
,如果有,编码是什么?如果文件没有这个头,你知道实际编码吗?
这是我的脚本在创建 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,但它可能不是。 @Nosibfile 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