From: siena@... (Siena. / SHINAGAWA, Norihide) Date: 2003-11-30T23:48:39+09:00 Subject: [ruby-dev:22092] Re: Dir.glob と Shjift_JIS について Siena. です。 時間が取れなくて、パッチは試せていません。 こちらでの確認には少し時間がかかるかもしれません。 》これからマクロを整理しようと思うのですが、DJGPP や EMX の mblen は、 》どのような挙動をしますか? 》(Windows では mblen("ab", MB_CUR_MAX)が-1 を返すのですが・・・・) 文末に OS/2 with EMX での確認コードと実行結果を載せておきます。 一応、それについては正常に機能します。 ruby では、grep locale ruby-1.8.0/{.,*}/*.[ch] した範囲では setlocale() されていないようですから、ロケールは "C" ですね。 で、これで気が付いたのですが、MB_CUR_MAX == 1 になり、非 ASCII 文字に 対する mblen() は常に失敗して -1 を返す、という事はないでしょうか。 読み間違いなら良いのですが。 それならばと、"ja", "ja_JP", "ja_JP.Shift_JIS", "ja_JP.CP932" 等で setlocale() を試みたところ、全て失敗し、ロケールは "C" のままでした。 この結果から見ると、CharNext() が MB_CUR_MAX に頼っているので、 少なくとも EMX では実は正しく動かないような気がしてきました。うぬぬ。 mblen() (と、多分 EMX 依存の _nls_is_dbcs_lead()) を試すと 下記のようになります。とりあえずは、mblen() の第 2 引数を 大きめにとっておけば、変な文字列が来ない限りは動作しそうです。 指定値は、CP932 は DBCS ですから 2 バイトで十分そうですが、 他の環境も含めた一般的の MBCS まで考えるとどうなのでしょう。 やはり、ちゃんと setlocale() して、うちみたいな救えない 環境ではとりあえず個別に決め打ちで、とすべきでしょうか。 と。その前に。今まで setlocale() していなかったという事は。 もしかして、setlocale() すると ruby の他の部分で問題が起きたりしますか? $ cat mblentest.c /* vi:tabstop=4 */ #include #include #include /* isprint() */ #include /* _nls_is_dbcs_lead() */ int main( void ) { int i, n = 3, chk_len; char* list[] = { "ab", "てすと", "てaすとb" }; for( i = 0 ; i < n ; ++ i ) { char* str = list[ i ]; printf( "\n\"%s\"\n\n", str ); while( *str != '\0' ) { int c = (unsigned char) *str; int dbcs = _nls_is_dbcs_lead( c ); printf( "[<%xh> '%c'] %-8s : dbcs? = %d : mblen = { ", c, ( isprint( c ) ? c : ' ' ), str, dbcs ); for( chk_len = 1 ; chk_len <= 4 ; ++ chk_len ) printf( "%d =>%- d, ", chk_len, mblen( str, chk_len ) ); puts( "}" ); str += ( ( dbcs && str[ 1 ] != '\0' ) ? 2 : 1 ); /* str += mblen( str, 2 ); */ /* 2 bytes for DBCS chars */ } } return 0; } $ gcc mblentest.c && ./mblentest "ab" [<61h> 'a'] ab : dbcs? = 0 : mblen = { 1 => 1, 2 => 1, 3 => 1, 4 => 1, } [<62h> 'b'] b : dbcs? = 0 : mblen = { 1 => 1, 2 => 1, 3 => 1, 4 => 1, } "てすと" [<82h> ' '] てすと : dbcs? = 1 : mblen = { 1 =>-1, 2 => 2, 3 => 2, 4 => 2, } [<82h> ' '] すと : dbcs? = 1 : mblen = { 1 =>-1, 2 => 2, 3 => 2, 4 => 2, } [<82h> ' '] と : dbcs? = 1 : mblen = { 1 =>-1, 2 => 2, 3 => 2, 4 => 2, } "てaすとb" [<82h> ' '] てaすとb : dbcs? = 1 : mblen = { 1 =>-1, 2 => 2, 3 => 2, 4 => 2, } [<61h> 'a'] aすとb : dbcs? = 0 : mblen = { 1 => 1, 2 => 1, 3 => 1, 4 => 1, } [<82h> ' '] すとb : dbcs? = 1 : mblen = { 1 =>-1, 2 => 2, 3 => 2, 4 => 2, } [<82h> ' '] とb : dbcs? = 1 : mblen = { 1 =>-1, 2 => 2, 3 => 2, 4 => 2, } [<62h> 'b'] b : dbcs? = 0 : mblen = { 1 => 1, 2 => 1, 3 => 1, 4 => 1, } --- Siena.