【问题标题】:REXML and encodingREXML 和编码
【发布时间】:2013-04-10 06:25:37
【问题描述】:

谁能帮我解释一下这个结果?

#!/usr/bin/env ruby
# encoding: utf-8

require 'rexml/document'

doc = REXML::Document.new(DATA)
puts "doc: #{doc.encoding}"
REXML::XPath.each(doc, '//item') do |item|
  puts "  #{item}: #{item.to_s.encoding}"
end

__END__
<doc>
  <item>Test</item>
  <item>Über</item>
  <item>8</item>
</doc>

输出:

doc: UTF-8
  <item>Test</item>: US-ASCII
  <item>Über</item>: UTF-8
  <item>8</item>: US-ASCII

似乎 REXML 不关心文档编码是什么,并开始自动检测每个项目的编码...我是否注定要 encode('UTF-8') 从 REXML 中提取的每个字符串,即使 UTF-8 是原始编码?这里发生了什么?

【问题讨论】:

  • 好问题。对我来说是新维度。

标签: ruby encoding utf-8 rexml


【解决方案1】:

您正在通过您的Element 呼叫Node.to_s()。要获取实际文本,请将Element.get_text() 添加到您的链中(并在上面调用Text.to_s()):

puts "  #{item}: #{item.get_text.to_s.encoding}"

输出:

doc: UTF-8
  <item>Test</item>: UTF-8
  <item>Über</item>: UTF-8
  <item>8</item>: UTF-8

【讨论】:

  • 呃,这不符合我的要求。我正在尝试模拟inner_html(REXML 中缺少 AFAIK),所以我不想要文本节点,我想要item 元素的 XML 表示,to_s 可以。您的编码与冒号前的编码不匹配( 隐含的to_s)。 (另外,AFAIK,如果我确实想要文本,.text 应该等同于 .get_text.to_s...)
  • 正确,REXML 没有 Nokogiri 的 inner_htmlElement.text() 等效于 Element.get_text().value() 如果您确实需要文本节点,那确实会更好。当Node.to_s() 生成字符串时,它会从头开始,而不考虑原始文件的编码。在源头附近戳,我看不出有什么办法。 (本质上是"" + "&lt;" + node.name + "&gt;" + ...
  • 根据你的需要,你不一定有问题,顺便说一句......位是一样的,你只是没有显示 UTF-8 的字符串元数据。
  • 是的,我最终选择了encode 路线。 (问题是在某些情况下检测到了一个不稳定的编码,然后当join 将这些片段组合在一起时,我会得到不兼容的编码错误。)不过,我希望to_s 尊重Document.encoding。 :( 谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多