2015-09-23 7 views
0

問題:紅寶石:解析YAML從ANSI爲UTF-8

我有YAML文件test.yml可以在UTF-8或ANSI編碼:

:excel: 
    "Test": 
    "eins_Ä": :eins 
    "zwei_ä": :zwei 

當我加載文件因此,我需要它在UTF-8編碼試圖把所有的字符串:

require 'yaml' 
file = YAML::load_file('C:/Users/S61256/Desktop/test.yml') 

require 'iconv' 
CONV = Iconv.new("UTF-8", "ASCII") 

class Test 

    def convert(hash) 
     hash.each{ |key, value| 
      convert(value) if value.is_a? Hash 
      CONV.iconv(value) if value.is_a? String 
      CONV.iconv(key) if key.is_a? String 
     } 
    end 

end 

t = Test.new 
converted = t.convert(file) 

p file 
p converted 

但是當我嘗試運行此示例腳本,它打印:

in 'iconv': eins_- (Iconv:IllegalSequence)

問題:

爲什麼錯誤出現了,我該怎麼解決呢?

2.是否有另一種更合適的方式來獲取UTF-8文件的內容?

注: 我需要此代碼與Ruby 1.8以及Ruby 2.2兼容。對於Ruby 2.2,我會用String :: encode替換所有Iconv的東西,但這是另一個話題。

回答

1

應對錯誤編碼的文件,最簡單的方法是在其原始編碼讀它,轉換爲UTF-8,然後傳遞給接收器(YAML在這種情況下):

▶ YAML.load File.read('/tmp/q.yml', encoding: 'ISO-8859-1').force_encoding 'UTF-8' 
#⇒ {:excel=>{"Test"=>{"eins_Ä"=>:eins, "zwei_ä"=>:zwei}}} 

爲Ruby 1.8你應該可能使用Iconv,但整個過程(比原碼讀取,比yaml-load)保持不變。