YAML.dumpで日本語が文字化けする

YAML.dumpでUTF8文字列をダンプする際にはバイナリと認識されてしまい、ファイルに保存した際にちょっと困ったことになります。

Psychなどを使う方法があるとのことですが、1.8だと気軽には使えません。

一つすばらしいやり方が紹介されていたのでちょっと改造してみます

http://projectzero-swb.blogspot.jp/2010/06/rubyyaml2.html

  • CentOS5.4
  • ruby1.8.7
#!/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
}

実行結果

はちゅね,2:みく
めぐりね,4:るか
かがみね,3:りん・れん
はつね,1:みく

test3.yaml

--- 
"はちゅね": !ruby/object:Name
	name: "みく"
	"no": 2
"めぐりね": !ruby/object:Name
	name: "るか"
	"no": 4
"かがみね": !ruby/object:Name
	name: "りん・れん"
	"no": 3
"はつね": !ruby/object:Name
	name: "みく"
	"no": 1