Ruby1.9.2から1.9.3以上に上げるときのYAMLの文字化け問題について

Pocket

Rubyで使用されるYAMLパーサーがRubyのバージョンによって異なるため、YAMLでマルチバイト情報を扱っている場合は、バージョンアップ時に注意が必要です。

どんな問題なの?

  • 1.9.2まで:Syckというパーサーがデフォルトで利用される
  • 1.9.3から:Psychというパーサーがデフォルトで利用される

SyckPsychとでマルチバイトの扱いが異なるため、Syckを利用して保存したマルチバイトを含むYAML情報をPsychで読もうとすると、文字化けします。

そして文字化けしたまま再度保存してしまうと、元に戻らなくなります。

そういう訳で、例えばDBのカラムにシリアライズしたYAML情報を保存しているような場合に、こういった問題が顕在化しやすくなります。

どう対応すれば良いの?

過去にGistにまとめていたものを発掘したので、公開します。

https://gist.github.com/mahm/eb3baf0e84102a318a12

既にSyckを使ってYAML情報を保存している場合は、YAMLパーサーをSyckに固定してしまうのが、一番楽な対応方法です。ただ、いつこのパーサーがなくなってしまうのかが、問題ですが・・・。(Rubyにバンドルされなくなったあとは、Gemとして公開されるらしいですが・・・)

そもそも

どうしてもシリアライズしてDBに保存しなくてはいけない場合、最近はJSONにして保存するようにしています。マルチバイトの問題がないのと、JSONの方がパーサーのパフォーマンスが高い、更に汎用性の高いフォーマットのため、安牌かなと思っています。