[ruby-list:41782] Re: YAMLのマルチバイト文字列の扱いについて

From: 西 啓一朗 <receiver@...>
Date: 2006-01-17 22:50:51 UTC
List: ruby-list #41782
ども、西啓一朗@Ktouth Brand. です。

えーと、まとめると

 * YAMLの本来の仕様だと、エンコードはUnicode(UTF8)でなければならない
 * 1.8.3以降、yaml.rb/syck.so も本来の仕様に合わせようとしている
 * が、現状「バイナリ判定」および「文字のエスケープ処理」が日本語を
   意識しない作りになっている。
 * :to_yaml 等に渡す文字コード(:Encoding)はまだ未処理。

と言うことで良いのでしょうか?

ソースを追ってみたところ、バイナリでなくインスタンス変数を持たないString
は YAML::Syck::Out#scalar に 文字列として渡され、SyckNodeに格納されてい
ました。
で、おそらくココが文字列を出力している部分なのでしょうが……
emitter.c:
 syck_emit_scalar
   → syck_emit_2quoted
     → syck_emitter_escape
と飛んでエンコード処理の一切がない形でエスケープ処理を行っています。
rubyコードをだいぶん離れた書き方をしてあるのでどういじればいいのかさっぱ
りです^^;

On Tue, 17 Jan 2006 19:57:48 +0900
"H.Yamamoto" <ocean@m2.ccsnet.ne.jp> wrote:

H.Yamamoto> こんにちは、山本です。
H.Yamamoto> ちょうどこの辺りを調べていたところでした。
H.Yamamoto> 
H.Yamamoto> ひとつは、YAML のバイナリ判定が甘いために、マルチバイト文字が
H.Yamamoto> バイナリと判定されることがあるためです。(lib/yaml/rubytypes.rb)
(中略)
H.Yamamoto> こうすると、バイナリではなく文字列として出力されると思います。
H.Yamamoto> ただ、それでも日本語じゃなく、エスケープシーケンスが出力されると思います。
H.Yamamoto> これが挙動としてどうなのか、YAML の仕様的にどうなのかはまだわかっていません。
H.Yamamoto> 
H.Yamamoto> http://yaml.org/spec/current.html#id2513364 によると、YAML は UTF じゃないと
H.Yamamoto> いけないらしいのですが、それにしては UTF-8 を渡してもエスケープされますし・・・
H.Yamamoto> 
H.Yamamoto> # YAML は 1.8.3 で大きな変更があり、これもそのひとつです。なお、メンテナは
H.Yamamoto> # 外国の人で、why the lucky stiff と言います。


-- 
西 啓一朗 <ktouth@k-brand.gr.jp>


In This Thread