L O S T :(用Ruby YAML倾倒一些数据,无法读回来

时间:2010-11-10 22:03:03

标签: ruby encoding yaml

所以我使用以下代码将这些对象保存到磁盘(这是Windows BTW上的Ruby 1.9.2):

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"

第一个产品运行正常,但第二个产品例外。

3 个答案:

答案 0 :(得分:1)

这可能是你的编码错了。你可以试试这个:

Encoding.default_external = 'BINARY'

这应该在raw文件中读取,而不是解释为UTF-8。你可能会使用某种ISO-8859-1重音。

答案 1 :(得分:0)

显然,您需要使用与之相同的编码来读取文件。由于在任何一种情况下都没有指定编码,因此基本上会在控件之外使用依赖于环境的编码,这就是为什么不指定编码永远不是一个好主意。

您发布的代码段显然无效UTF-8,因此您获得例外的事实非常合适。

答案 2 :(得分: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字符集时打印第二个元素的值,则会看到分号。因此,如果您尝试重新获得对数据的访问权限,那么您需要做的就是对数据文件进行一些操作。