libxml将重音字符转换为反斜杠x转义符。杰森不高兴

时间:2010-01-27 16:53:27

标签: ruby json libxml2

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

3 个答案:

答案 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)