2010-11-10 86 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字符集我看到分号。所以,如果你试图恢复对数据的访问,你所要做的只是对数据文件的一些操作。