2011/02/22

Ruby 1.9.2以降(移行後?) - YAML::unescapeの行方

作成しているアプリケーションの中で設定を変更するために、YAMLデータ形式を経由してsave/restore機能を付けています。

便利に使っていたのですが、やや本気で使ってみたところ、UTF-8な日本語文字列をファイルに書き出したタイミングでエスケープされた形式になってしまう事に気がつきました。

YAML形式でファイルを書き出すsave_yamlモジュールメソッド

  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 件のコメント: