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

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2006-01-18 11:58:28 UTC
List: ruby-list #41788
山本です。

>ども、西啓一朗@Ktouth Brand. です。
>
>えーと、まとめると
>
> * YAMLの本来の仕様だと、エンコードはUnicode(UTF8)でなければならない

UTF-16 でもいいようですが、BOF がない場合は UTF-8 でないといけないので、
SJIS や EUC はだめだということになりますね。

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

本当のところは _why に聞かないとわからないですが、
たぶん、そんな感じじゃないかと思います。

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

そおですね、lib/yaml/rubytypes.rb の String#to_yaml で :Encoding を見て
UTF-8 への変換をして、Syck の内部的には UTF-8 だけ処理するようにして、
ext/syck/emitter.c の

/*
 * Basic printable test for LATIN-1 characters.
 */
int
syck_scan_scalar( int req_width, char *cursor, long len )

を Basic printable test for UTF-8 characters. になるように改善すると
望ましい結果になる・・・のかな?("\r" などを含むときはエスケープ。
そうでなければそのまま)

これだと出力は UTF-8 になってしまいますが・・・



In This Thread

Prev Next