From: siena@... (Siena. / SHINAGAWA, Norihide) Date: 2004-01-22T18:44:35+09:00 Subject: [ruby-dev:22670] mblen() (was: Re: patches for i386-os2-emx) Siena. です。 サブジェクトを変えました。 C 標準関数の mblen() は、検査範囲を高々 count バイトに限定して、 mbstr で指される多バイト文字列先頭の多バイト文字のバイト数 (多バイト文字として不正ならば -1) を返す、という物という理解でいます。 以下、この前提で。 ▼ WATANABE Hirofumi さん < [ruby-dev:22663] 》djgpp版rubyでmblenを使っているのは、stat()のような関数の内部 》でmblen()が使われていたからです(実際は_fixpath()の中)。 》なぜかmblen()自体は0か1だけつまりmultibyteのことは何も考えな 》い仕様になっていました。そこで各自やりたいようにつじつまを合 》わせろと勝手に解釈してutil.cでmblen()を実装してます。 なるほど。grep MB_CUR_MAX でしか見ていなかったので、 ユーザ実装の mblen() の存在に気が付いていませんでした。 util.c の DJGPP 用 mblen(const char *s, size_t n) を見ました。 s[0] が多バイト文字の 1 バイト目で、s[1] が '\0' の場合などで 異常を知らせるために -1 を返すようにしないで良いのでしょうか。 使われ方によっては、s[mblen(s,N)] が '\0' でない時に ナル終端を飛び越えてしまって危険な気がします。 》だから、他の環境でmblen()を使うのはまずいですね。 問題点と改善方法を理解するまでに至っていませんが。 ちょっとコードを流し読みしていて気になった点を。 wince/stdlib.c の mblen(const char* mbstr, size_t count) は C 標準関数のそれとは機能が違うようですが、意図した物でしょうか。 WinCE 用の mblen() は、mbstr で始まる多バイト文字列の count バイトを超えない部分文字列のバイト数を返しているようです。 たまたま辻褄が合っているだけで問題になっていないか、 問題がなくても紛らわしかのどちらかだと思います。 --- Siena.