2010-11-10 13 views
0

所以我保存到磁盤使用下面的代碼的某些對象(這是紅寶石1.9.2在Windows BTW):LOST :(甩了一些數據,使用Ruby YAML,不能讀回

open('1.txt', "wb") { |file| 
    file.write(YAML::dump(results)) 
} 

現在我試圖找回那些數據,但是在UTF-8(ArgumentError)中得到了'無效的字節序列',我嘗試了所有我能想到的以不同格式保存數據的想法,但沒有運氣,例如

open('1.txt', 'rb'){|f| a1 = YAML::load(f.read)} 
a1.each do |a| 
    JSON.generate(a) 
end 

結果於:

C:/m/ruby-1.9.2-p0-i386-mingw32/lib/ruby/1.9.1/json/common.rb:212:in `match': 
invalid byte sequence 
in UTF-8 (ArgumentError) 
    from C:/m/ruby-1.9.2-p0-i386-mingw32/lib/ruby/1.9.1/json/common.rb:212:in `generate' 
    from C:/m/ruby-1.9.2-p0-i386-mingw32/lib/ruby/1.9.1/json/common.rb:212:in `generate' 
    from merge3.rb:31:in `block in <main>' 
    from merge3.rb:29:in `each' 
    from merge3.rb:29:in `<main>' 

我該怎麼辦?

編輯:從文件:

--- 
- !ruby/object:Product 
    name: HSF 
- !ruby/object:Product 
    name: "almer\xA2n" 

首屆產品工程確定,但第2給出了異常。

+0

您能否在'1.txt'中提供YAML輸出的摘錄? – ocodo 2010-11-10 22:04:27

+0

添加了問題的摘錄。 – 2010-11-10 22:24:31

回答

0

顯然,您需要重新讀取文件,使用相同的編碼來寫出它。既然在這兩種情況下你都沒有指定編碼,你基本上最終會得到一個不依賴於環境的編碼,這就是爲什麼不指定編碼永遠不是一個好主意。

您發佈的代碼段爲顯然無效的UTF-8,因此您收到異常的情況非常合適。

+0

那麼,如果你知道什麼是UTF-8,那麼它顯然不是UTF-8。 – tadman 2010-11-10 22:33:18

+0

這些信息如何幫助我? – 2010-11-10 22:51:53

1

這可能是你的編碼錯了。你可以試試這個:

Encoding.default_external = 'BINARY' 

這應該讀取原始文件,不解釋爲UTF-8。你大概使用某種ISO-8859-1口音。

+0

插件在文件的開頭並沒有改變任何東西。 – 2010-11-10 22:51:02

+0

不是yaml文件,而是程序代碼... – DGM 2010-11-10 23:34:14

+0

:D我不是那麼笨。 – 2010-11-10 23:38:55

0

我不知道這是否是你追求的,但目前你的YAML文件看起來像:

--- 
- !ruby/object:Product 
    name: HSF 
- !ruby/object:Product 
    name: "almer\xA2n" 

如果您從陣列線的!ruby/object:Product你會得到哈希值的數組:

--- 
- name: HSF 
- name: "almer\xA2n" 

結果:

YAML::load_file('test.yaml') #=> [{"name"=>"HSF"}, {"name"=>"almer\xA2n"}] 

如果我打印時的第二個元素的值,我終端設置爲Windows字符集我看到分號。所以,如果你試圖恢復對數據的訪問,你所要做的只是對數據文件的一些操作。