2

我正在使用 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 之后,我收到以下错误。

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&#243;n Network - East Feed" 
4

3 回答 3

1

所以,我仍然完全不知道为什么我无法找出“正确”的方法来做到这一点,但是这个线程帮助找到force_encoding了 String 类的方法。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 进行编码吗?

于 2010-01-27T22:38:40.587 回答
0

但是,如果它这样做,它就会逃脱。

不完全的。您看到的是 UTF-8 输出解释为一串字节。

问题是您的 XML 文档说它是 ISO-8859-1,而实际上是 UTF-8。修复编码问题,它应该可以工作。

于 2010-01-27T17:15:05.197 回答
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)
于 2010-01-27T17:17:05.473 回答