From: KIMURA Koichi Date: 2006-04-24T18:10:40+09:00 Subject: [ruby-dev:28598] bug of regex.c (1.8) 木村です。 [ruby-list:42096] に関してちょっと調べてみました。 re_compile_pattern の中にあるキャラクタクラスの処理の部分で else { if (TRANSLATE_P()) c = (unsigned char)translate[c]; if (had_mbchar == 0 && (!current_mbctype || !had_num_literal)) { SET_LIST_BIT(c); had_num_literal = 0; } else { set_list_bits(c, c, b); } } というのがありますが、マルチバイトを考慮した処理になっているとき、 c にはマルチバイト文字の場合には泣き別れになった状態ではなくて High byte と low byte が bitwise or された状態で来ています (ShiftJISで'知'なら 0x926d)。 しかし、TRANLATE_Pでは対象がマルチバイト文字かどうかの判定をしていない ので、マルチバイト文字をそのまま使ってテーブルを引いてしまっています。 結果、ごみを使って変換することになっています。 とりあえずテーブルを引く前にマルチバイト文字かどうかを判定する必要が あるのではないでしょうか? --- regex.c.1~ 2005-10-19 01:27:53.000000000 +0900 +++ regex.c 2006-04-24 17:57:07.028500000 +0900 @@ -1705,7 +1705,7 @@ re_compile_pattern(pattern, size, bufp) goto range_retry; } else { - if (TRANSLATE_P()) c = (unsigned char)translate[c]; + if (TRANSLATE_P() && c < 0x100) c = (unsigned char)translate[c]; if (had_mbchar == 0 && (!current_mbctype || !had_num_literal)) { SET_LIST_BIT(c); had_num_literal = 0; -- 木村浩一