我在用libxml读取的xml节点中有以下属性。如果我打印出reader.node,它通常会带有重音字符。
reader = XML::Reader.new(File.open("somefile.xml", "r"))
reader.read
reader.read
...
p reader.node
=> ... Full_Name="Univisión Network - East Feed" ...
但是,如果我这样做,它就会逃脱。
p reader.node["Full_Name"]
=> "Univisi\xC3\xB3n Network - East Feed"
当我尝试将此值转换为json laater时,我收到以下错误。
Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8
这是文档中的xml行
<?xml version="1.0" encoding="ISO-8859-1"?>
我无法控制xml文档本身。我怎样才能将这个unicode角色带回json,或者变成json理解的格式?
编辑:哦,我忘了提一下 - 这就是它在实际的XML文档中的样子
Full_Name="Univisión Network - East Feed"
答案 0 :(得分:1)
所以,我仍然完全迷失了为什么我无法找到“正确”的方法来做到这一点,但是this thread帮助在String类上找到了force_encoding
方法。由于我的代码无论如何都涉及将属性复制到哈希中,因此在复制值时调用force_encoding
并不是什么大问题。
我双倍确定我已将文件保存为UTF-8,并将正确的xml声明放在顶部。它仍然失败了。
无论如何,直到我能弄清楚如何解决实际问题,这段代码修复了它。
object = { type: node.name }
node.attributes.each do |attribute|
name = attribute.name.gsub /_/,""
value = attribute.value.force_encoding('UTF-8')
object[name] = value
end
请注意,如果我不需要将节点复制到哈希中,这是不合适的,因为它肯定不值得一切麻烦。如果我那么
object.to_json
它没有问题。谢谢你的帮助斧头!你知道如何在xml上强制编码吗?
答案 1 :(得分:0)
如果这样做,它就会逃脱。
不完全。您所看到的是UTF-8输出被解释为一串字节。
问题是您的XML文档表示它是ISO-8859-1,而它确实是UTF-8。修复编码问题,它应该可以工作。
答案 2 :(得分:0)
修改强>
所以我一直在尝试解决这个问题已经有一段时间了。有趣的事情:你的代码在ruby 1.8中没有错误(至少在这里)。所以我认为这个错误与ruby 1.9的新编码处理有关。不知何故,它无法弄清楚解析和读取的XML是(libxml的内部)utf-8格式(文档编码在这里无关紧要:在1.8中,它适用于iso-8859-1和utf-8,即使是错误的xml编码声明)。相反,它将其视为ASCII-8BIT或BINARY。换句话说,它不知道编码。这就是to_json
未能尝试将其转换为utf-8的原因。
解决问题的最简单方法可能是降级为ruby 1.8。
或者,您force_encoding('UTF-8')
的方法似乎是合理的
编辑结束
您可以尝试将正确的编码传递给读者:
reader = XML::Reader.new(File.open("somefile.xml", "r"),
XML::Encoding::ISO_8859_1)