代码之家  ›  专栏  ›  技术社区  ›  Sean Clark Hess

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

  •  2
  • Sean Clark Hess  · 技术社区  · 15 年前

    在使用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 version="1.0" encoding="ISO-8859-1"?>
    

    我无法控制xml文档本身。如何将unicode字符转换回json,或转换成json可以理解的格式?

    :哦,我忘了提到-这是它在实际XML文档中的外观

    Full_Name="Univisi&#243;n Network - East Feed" 
    
    3 回复  |  直到 13 年前
        1
  •  0
  •   ax. Clement Herreman    15 年前

    编辑
    所以我一直在努力解决这个问题已经有相当一段时间了。有趣的是:您的代码在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_encoding('UTF-8')
    编辑结束

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

    reader = XML::Reader.new(File.open("somefile.xml", "r"), 
      XML::Encoding::ISO_8859_1)
    
        2
  •  1
  •   Sean Clark Hess    15 年前

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

        3
  •  0
  •   Jim Garrison    15 年前

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

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

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