所以我使用以下代码将这些对象保存到磁盘(这是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"
第一个产品运行正常,但第二个产品例外。
答案 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字符集时打印第二个元素的值,则会看到分号。因此,如果您尝试重新获得对数据的访问权限,那么您需要做的就是对数据文件进行一些操作。