Rubyで使用されるYAMLパーサーがRubyのバージョンによって異なるため、YAMLでマルチバイト情報を扱っている場合は、バージョンアップ時に注意が必要です。
どんな問題なの?
- 1.9.2まで:
Syck
というパーサーがデフォルトで利用される - 1.9.3から:
Psych
というパーサーがデフォルトで利用される
Syck
とPsych
とでマルチバイトの扱いが異なるため、Syck
を利用して保存したマルチバイトを含むYAML情報をPsych
で読もうとすると、文字化けします。
そして文字化けしたまま再度保存してしまうと、元に戻らなくなります。
そういう訳で、例えばDBのカラムにシリアライズしたYAML情報を保存しているような場合に、こういった問題が顕在化しやすくなります。
どう対応すれば良いの?
過去にGistにまとめていたものを発掘したので、公開します。
https://gist.github.com/mahm/eb3baf0e84102a318a12
既にSyck
を使ってYAML情報を保存している場合は、YAMLパーサーをSyck
に固定してしまうのが、一番楽な対応方法です。ただ、いつこのパーサーがなくなってしまうのかが、問題ですが・・・。(Rubyにバンドルされなくなったあとは、Gemとして公開されるらしいですが・・・)
そもそも
どうしてもシリアライズしてDBに保存しなくてはいけない場合、最近はJSONにして保存するようにしています。マルチバイトの問題がないのと、JSONの方がパーサーのパフォーマンスが高い、更に汎用性の高いフォーマットのため、安牌かなと思っています。