如何解码ruby中的字符串UTF-8?

时间:2015-03-06 04:01:13

标签: ruby character-encoding nokogiri

我在ruby(file.rb)中解析xml文件,但即使我用UTF-8或" ISO-8859-1&#编码字符串,我的输出也无法正常工作34 ;.任何线索或我可以设置我的编码? gist

require 'test/unit'
require 'nokogiri'

class MyTest < Test::Unit::TestCase

  def test_sentence
doc = Nokogiri::Slop <<-EOXML
<?xml version='1.0' encoding='utf-8'?>
<codeBook version="1.2.2" ID="klm-456-30">
     <var ID="V604" name="FHP_V145" wgt-var="K2" files="F1" dcml="0"
        intrvl="discrete">
          <qstn>
            <qstnLit>Dans quelle mesure cette aide vous a-t-elle
            &#195;&#169;t&#195;&#169; utile? &#195;&#8240;tait-elle
            :</qstnLit>
          </qstn>
    </var>
    <qstn>
</codeBook>
EOXML
  sentence = doc.children.css("[name=FHP_V145]").children.search("qstnLit").first.text.force_encoding("UTF-8").split("\n")
  sentence = sentence.map {|n| n.split.join(" ") }
  sentence = sentence.join(" ")
  puts sentence
    assert_equal(sentence, "Dans quelle mesure cette aide vous a-t-elle été utile? Était-elle :")
  end
end

2 个答案:

答案 0 :(得分:1)

XML似乎已损坏。字符实体应指定如下。

require 'test/unit'
require 'nokogiri'

class MyTest < Test::Unit::TestCase

  def test_sentence
doc = Nokogiri::Slop <<-EOXML
<?xml version='1.0' encoding='utf-8'?>
<codeBook version="1.2.2" ID="klm-456-30">
     <var ID="V604" name="FHP_V145" wgt-var="K2" files="F1" dcml="0"
       intrvl="discrete">
         <qstn>
           <qstnLit>Dans quelle mesure cette aide vous a-t-elle
           &#233;t&#233; utile? &#201;tait-elle
           :</qstnLit>
         </qstn>
     </var>
     <qstn>
</codeBook>
EOXML
  sentence = doc.children.css("[name=FHP_V145]").children.search("qstnLit").first.text.force_encoding("UTF-8").split("\n")
  sentence = sentence.map {|n| n.split.join(" ") }
  sentence = sentence.join(" ")
  puts sentence
    assert_equal(sentence, "Dans quelle mesure cette aide vous a-t-elle été utile? Était-elle :")
  end
end

如果无法更正XML,则可以在读取之前将这些实体替换为实际字符,如下所示。然而&amp;#8240;是不正确的。它应该是&amp;#137;

require 'test/unit'
require 'nokogiri'

class MyTest < Test::Unit::TestCase

  def test_sentence
doc = Nokogiri::Slop <<-EOXML.gsub(/\&#([^;]+);/){[$1.to_i].pack('c')}
<?xml version='1.0' encoding='utf-8'?>
<codeBook version="1.2.2" ID="klm-456-30">
     <var ID="V604" name="FHP_V145" wgt-var="K2" files="F1" dcml="0"
        intrvl="discrete">
          <qstn>
            <qstnLit>Dans quelle mesure cette aide vous a-t-elle
            &#195;&#169;t&#195;&#169; utile? &#195;&#137;tait-elle
            :</qstnLit>
          </qstn>
    </var>
    <qstn>
</codeBook>
EOXML

  sentence = doc.children.css("[name=FHP_V145]").children.search("qstnLit").first.text.force_encoding("ascii-8bit").split("\n")
  sentence = sentence.map {|n| n.split.join(" ") }
  sentence = sentence.join(" ")
  puts sentence
    assert_equal(sentence, "Dans quelle mesure cette aide vous a-t-elle été utile? Était-elle :")
  end
end

答案 1 :(得分:1)

Nokogiri试图通过编码做到最好。由于它遇到&#8240;,显然是promille sign,因此它确保输入文本为UTF-8 - ed。到目前为止,它是默认的Nokogiri编码。

UTF-8中,&#195;Ã&#169;©。因此,您的输出正确。也就是说,您的输入可能不正确。