2013-04-10 52 views
0

任何人都可以爲我解釋這個結果嗎?REXML和編碼

#!/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')每個字符串我拉儘管UTF-8是原始編碼,但是在REXML之外?這裏發生了什麼?

+0

好question.New尺寸適合我。 – 2013-04-10 07:01:57

回答

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 
+0

呃,那不符合我的要求。我試圖模擬'inner_html'(AFAIK在REXML中缺失),所以我不想要文本節點,我想要'to_s'的'item'元素的XML表示。您的編碼與冒號前面的內容(它是*隱式的'to_s')的編碼不匹配。 (另外,AFAIK,如果我確實需要文本,'.text'應該等同於'.get_text.to_s' ...) – Amadan 2013-04-10 07:18:24

+0

正確,REXML沒有Nokogiri的'inner_html'。 'Element.text()'相當於'Element.get_text()。value()',如果你確實需要文本節點,那確實會更好。當'Node.to_s()'生成字符串時,它將從頭開始,而不考慮原始文件的編碼。圍繞着消息來源,我看不出有什麼辦法。 (本質上是''「+」<「+ node.name +」>「+ ...') – 2013-04-10 08:11:33

+0

根據你的需要,你不一定有問題,順便說一下......位是同樣,你只是沒有顯示UTF-8的字符串元數據。 – 2013-04-10 08:15:28