YAML.dumpでUTF8文字列をダンプする際にはバイナリと認識されてしまい、ファイルに保存した際にちょっと困ったことになります。
Psychなどを使う方法があるとのことですが、1.8だと気軽には使えません。
一つすばらしいやり方が紹介されていたのでちょっと改造してみます
http://projectzero-swb.blogspot.jp/2010/06/rubyyaml2.html
- CentOS5.4
- ruby1.8.7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #!/usr/bin/env ruby # -*- encoding: utf-8 -*- require "yaml" require "yaml/encoding" # String.is_binary_data?で必ずfalseを返すように書き換える class String def is_binary_data? return false end end class Name attr_reader:no,:name def initialize(no,name) @no=no @name=name end def to_s return @no.to_s+":"+@name.to_s end end data = {"はつね"=>Name.new(1,"みく"), "はちゅね"=>Name.new(2,"みく"), "かがみね"=>Name.new(3,"りん・ れん"), "めぐりね"=>Name.new(4,"るか")} # 通常どおり表示 #puts "Escape:" yaml = YAML.dump(data) # アンエスケープして表示 #puts "Unescape:" yaml = YAML.unescape(yaml) f=open("test3.yaml","w") f.write(yaml) f.close f=YAML.load_file("test3.yaml") f.each{|k,v| puts k+","+v.to_s } |
実行結果
1 2 3 4 | はちゅね,2:みく めぐりね,4:るか かがみね,3:りん・れん はつね,1:みく |
test3.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 | --- "はちゅね": !ruby/object:Name name: "みく" "no": 2 "めぐりね": !ruby/object:Name name: "るか" "no": 4 "かがみね": !ruby/object:Name name: "りん・れん" "no": 3 "はつね": !ruby/object:Name name: "みく" "no": 1 |