2010年6月30日水曜日

RubyのYAMLライブラリで2バイト文字をそのまま扱う

RubyのYAMLライブラリでは、標準では日本語などの2バイト文字列をバイナリとして扱うようになっている。しかし、これでは人間が直接修正するのが非常に面倒である。

技術評論社のYAML解説ページには、Rubyのソースにパッチを当てビルドする方法や、ya2yamlを使用する方法が書いてあった。しかし、パッチを当てた環境をすべてに適用するのは非常に面倒であり、ya2yamlについては標準ライブラリではない上に、少々遅いという問題がある。

そこで、どうにかする方法はないものかとYAMLのソースを眺めていたところ、以下の方法であっさり解決してしまった。



#!/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

data = {"はつね"=>"みく", "はちゅね"=>"みく", "かがみね"=>"りん・れん", "めぐりね"=>"るか"}

# 通常どおり表示
puts "Escape:"
puts yaml = YAML.dump(data)

# アンエスケープして表示
puts "Unescape:"
puts yaml = YAML.unescape(yaml)


一度エスケープされたものをまた戻すという、面倒なことになっているが、ソース修正するよりマシかな…と。
これで、YAMLで書き出して手動で編集…なんてことがやりやすくなるかもしれない。

1 件のコメント:

匿名 さんのコメント...

前から悩んでたんで割りと本気で助かりました。
情報ありがとうございます。