From: "H.Yamamoto" Date: 2006-01-17T19:57:48+09:00 Subject: [ruby-list:41779] Re: YAMLのマルチバイト文字列の扱いについて こんにちは、山本です。 >どうも、西啓一朗と申します。 >ちょっとした疑問がわいたので質問させてください。 > >自分が使用しているレンタルサーバで使用するCGIを組んでいます。 >そのCGIでデータを保存するためにYAMLを利用しているのですが、保存したテキ >ストファイルにちょっとした差違があったのです。 > >レンタルサーバでの動作(FreeBSD4/csh) >> %cat out.txt >> さんぷる >> %ruby -Ke -v -ryaml -e "y File.open('out.txt').read" >> ruby 1.8.2 (2004-12-25) [i386-freebsd4] >> --- "さんぷる" >> % > >自宅(WinXP/Cygwin版ruby/bash) >> xxx:~$ cat out.txt >> さんぷる >> xxx:~$ ruby -Ke -v -ryaml -e "y File.open('out.txt').read" >> ruby 1.8.4 (2005-12-24) [i386-cygwin] >> --- !binary | >> pLWk86TXpOs= >> >> xxx:~$ > >テキストファイルのエンコードはどちらもeuc-jpで同じものです。 > >どうやらcygwin環境の方は文字列のエンコードを認識してないようなんですが、 >この差はどこで出ているのでしょうか? >補足:YAML出力が違うだけで、中身は一致しています。 ちょうどこの辺りを調べていたところでした。 ひとつは、YAML のバイナリ判定が甘いために、マルチバイト文字が バイナリと判定されることがあるためです。(lib/yaml/rubytypes.rb) require "yaml" class String def is_binary_data? # [ruby-list:16014] return true if self.include?(0) check = self[0, 512] check.size < 10 * check.count("\x00-\x07\x0b\x0e-\x1a\x1c-\x1f") end end y File.open('out.txt').read こうすると、バイナリではなく文字列として出力されると思います。 ただ、それでも日本語じゃなく、エスケープシーケンスが出力されると思います。 これが挙動としてどうなのか、YAML の仕様的にどうなのかはまだわかっていません。 http://yaml.org/spec/current.html#id2513364 によると、YAML は UTF じゃないと いけないらしいのですが、それにしては UTF-8 を渡してもエスケープされますし・・・ # YAML は 1.8.3 で大きな変更があり、これもそのひとつです。なお、メンテナは # 外国の人で、why the lucky stiff と言います。