作成しているアプリケーションの中で設定を変更するために、YAMLデータ形式を経由してsave/restore機能を付けています。
便利に使っていたのですが、やや本気で使ってみたところ、UTF-8な日本語文字列をファイルに書き出したタイミングでエスケープされた形式になってしまう事に気がつきました。
def save_yaml(file, hash)
require 'syck/encoding'
open(file, "w") do |f|
f.write(YAML::dump(hash))
f.flush
end
end
module_function :save_yaml
次のように、出力の一部は人間が読み書きできる形式ではなくなっています。
... title: "\xE3\x83\x97\xE3\x83..." ...
日本語に限らずヨーロッパ系言語も1バイトに収まらないものはあるので、困っている人は他にも居たようで、調べてみるとYAML::unescape()を使う workaround をみつけました。→ Ruby to_yaml utf8 string
しかしRuby 1.9.2移行はYAML関連のパッケージが syck.rb にまとめられてしまったので、モジュール名がSyckになっています。
結局はSyck::unescape
を使う事で無事に解決しました。
def save_yaml(file, hash)
require 'syck/encoding'
open(file, "w") do |f|
f.write(Syck::unescape(YAML::dump(hash)))
f.flush
end
end
module_function :save_yaml
0 件のコメント:
コメントを投稿