ruby 1.9 に同梱されている YAML ライブラリはエンコーディングが苦手なようです。
これが意味することは、YAML を生成するときに、任意のバイト文字列を取得し、クリーンな ASCII を出力しないバイト シーケンスをエスケープすることです。それは不自由ですが、受け入れられます。
私の問題は逆です。上記の YAML ダンプからコンテンツをロードするとき。
次の例では、UTF-8 文字列を作成してダンプします。タイプ でダンプされ!binary
ます。再度ロードすると、エンコーディングは ASCII-8BIT になります。例の最後で、元の文字列とリロードされた文字列の両方を別の UTF-8 文字列と連結しようとしています。後者は . で失敗しますEncoding::CompatibilityError
。
require 'yaml'
s0 = "Iñtërnâtiônàlizætiøn"
y = s0.to_yaml
s1 = YAML::load y
puts s0 # => Iñtërnâtiônàlizætiøn
puts s0.encoding # => UTF-8
puts s1 # => Iñtërnâtiônàlizætiøn
puts s1.encoding # => ASCII-8BIT
puts y # => --- !binary |
# ScOxdMOrcm7DonRpw7Ruw6BsaXrDpnRpw7hu
puts "ñårƒ" + s0 # => ñårƒIñtërnâtiônàlizætiøn
puts "ñårƒ" + s1 # => Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT
リーフ文字列を含むネストされたハッシュと配列を含む YAML ソースを扱う場合、これがどのようにすぐに問題を引き起こすかは明らかだと思います。
現在、すべてのハッシュと配列をトラバースしforce_encoding
、各文字列を呼び出すコードがいくつかあります。それは、控えめに言っても、見苦しいです。
私が今探しているのYAML::load
は、入ってくる文字列を扱う必要があることを伝える方法であり、そのため、エンコーディングを UTF-8 に設定します。
理想的には、Ruby の YAML は、ダンプする文字列に適切なエンコーディングで注釈を付けるべきです。UTF-8 セーフ YAML をダンプしようとする Ya2YAML プロジェクトがあります。どこまで進んでいるのかわかりません。誰かがそれで遊んだことがあれば、どんな考えも歓迎します。
それにもかかわらず、対処するエンコード情報がないこれらのダンプがまだあります。私はそれらがすべてUTF-8であることを知っていますが。