LO S T:(用Ruby YAML转储了一些数据,不能读回吗

LO S T:(用Ruby YAML转储了一些数据,不能读回吗,ruby,encoding,yaml,Ruby,Encoding,Yaml,因此,我使用以下代码将一些对象保存到磁盘(这是Windows上的Ruby 1.9.2): 现在我正试图取回数据,但得到的是“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-mingw3

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

现在我正试图取回数据,但得到的是“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>'
YAML::load_file('test.yaml') #=> [{"name"=>"HSF"}, {"name"=>"almer\xA2n"}]

第一个产品可以正常工作,但第二个产品会出现例外。

显然,您需要使用编写文件时使用的相同编码将文件读回。由于您在这两种情况下都没有指定编码,因此基本上会在您的控制范围之外使用依赖于环境的编码,这就是为什么不这样做从来都不是一个好主意指定编码


您发布的代码段显然是无效的UTF-8,因此您得到一个异常的事实是非常恰当的。

这可能是您的编码错误。您可以尝试以下方法:

Encoding.default_external = 'BINARY'

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

我不确定这是否是您想要的,但当前您的YAML文件看起来像:

--- 
- !ruby/object:Product 
  name: HSF
- !ruby/object:Product
  name: "almer\xA2n"
如果从数组行中删除
!ruby/object:Product
,将得到一个哈希数组:

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

 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>'
YAML::load_file('test.yaml') #=> [{"name"=>"HSF"}, {"name"=>"almer\xA2n"}]

当终端设置为Windows字符集时,如果我打印第二个元素的值,我会看到分号。因此,如果您试图重新访问数据,您所要做的就是对数据文件进行一点操作。

您能在
1.txt
中提供YAML输出的摘录吗?在问题的开头添加了一段摘录这是一个大约一年的问题,但是
open('myfile',“w:BINARY”)
为我解决了这个问题