From: WATANABE Hirofumi Date: 2004-01-22T16:27:23+09:00 Subject: [ruby-dev:22663] Re: patches for i386-os2-emx わたなべです。 Siena. / SHINAGAWA, Norihide writes: > 》[ruby-dev:22115] 多バイト文字の長さを正しく判定しない可能性を回避 > 》* Ruby は setlocale() しないので C ロケールで実行されている > 》* 多バイト文字の最大長 (MB_CUR_MAX) は C ロケールでは 1 > 》* setlocale() する拡張ライブラリからの影響を受ける可能性がある > 》* ついでに、EMX では ja_JP ロケールに setlocale() できない? > > これは、mblen() に MB_CUR_MAX を渡している箇所を適当に大きな値に > 置き換えるだけのものですが、コミットしてみても良いでしょうか。 > > C ロケールでは高々 1 バイトしか見ないため、多バイト文字を渡すと > 正しい多バイト文字でないと見做されて -1 が帰って来るので。 > 今まで問題になっていない (少なくとも気が付いていない) とはいえ、 > ちょっと不安があります。 > > そもそも、ロケールを特定しないで mblen() が正しく機能できる > 保証もないわけですが、それはまた別に検討すべきなのだと思います。 > とはいえ、ロケールを指定する以外の方法は思い付かないのですが。 あまり読んでなかったので、今頃こんなことを書くのもあれですが、 djgpp版rubyでmblenを使っているのは、stat()のような関数の内部 でmblen()が使われていたからです(実際は_fixpath()の中)。 stat()がlocaleに依存するなんてのはどう考えても変な仕様です。 なぜかmblen()自体は0か1だけつまりmultibyteのことは何も考えな い仕様になっていました。そこで各自やりたいようにつじつまを合 わせろと勝手に解釈してutil.cでmblen()を実装してます。 だから、他の環境でmblen()を使うのはまずいですね。 -- わたなべひろふみ