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

Ruby libxml将重音字符转换为反斜杠x转义。他不高兴,ruby,json,libxml2,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["Ful

在使用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"?>
但是,如果它这样做了,它就会逃脱

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

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

编辑
所以我一直在努力解决这个问题已经有相当一段时间了。有趣的是:您的代码在ruby 1.8中运行时没有错误(至少在这里)。所以我认为这个错误与ruby 1.9的新编码处理有关。不知何故,它无法确定解析和读取的XML是(libxml的内部)utf-8格式(文档编码在这里并不重要:在1.8中,它可以同时使用iso-8859-1和utf-8,即使使用错误的XML编码声明)。相反,它将其视为ASCII-8BIT或二进制。换句话说,它不知道编码。这就是为什么
to_json
无法将其转换为utf-8的原因

解决这个问题的最简单方法可能是降级到ruby 1.8

或者,您的
force_编码('UTF-8')
方法似乎是合理的。
编辑结束

您可以尝试将正确的编码传递给读取器:

reader = XML::Reader.new(File.open("somefile.xml", "r"), 
  XML::Encoding::ISO_8859_1)

所以,我仍然完全不明白为什么我不能找到“正确”的方法来做这件事,但是我帮助找到了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上强制编码吗

您知道如何覆盖xml文档的编码吗?同样,我无法更改xml文档。这不起作用:
reader=xml::reader.io(文件:encoding=>xml::encoding::UTF_8)
当我请求文档的编码时,它仍然返回旧的编码,应该是
xml::encoding::ISO_8859_1
-请参阅我的答案。即使将编码设置为ISO_8859_1,我仍然会收到错误。对不起,我弄糊涂了等等,我以为我想强迫它使用UTF-8?我不想要
reader=XML::reader.new(File.open(“somefile.XML”,“r”),:encoding=>XML::encoding::UTF_8)
?我仍然会错误地盲目粘贴代码,并且将其设置为UTF_8似乎并没有改变它(当我要求它的编码时,它仍然给出ISO_8859_1),那么
somefile.xml
(不管
)的真正编码是什么?我不太确定如何检查
file——mime somefile.xml
gives
application/xml;charset=us ascii
好吧,Ruby 1.9在这里对你很苛刻。问题是XML文档完全错了。它声称是ISO-8859-1,而实际上是UTF-8。您正在使用强制编码来修复它。作为一名Ruby开发人员,我不知道是否可以强制XML解析器忽略声明的编码,并对整个文档使用UTF-8。@Julik-我想说@Jim-是的,我也这么想,但我更改了顶部的声明,确保它保存为UTF-8(使用textmate),并强制进行编码(至少根据libxml库的文档),这仍然很奇怪。哦,好吧
object.to_json