From: Yukihiro Matsumoto Date: 2006-04-25T00:07:57+09:00 Subject: [ruby-dev:28599] Re: bug of regex.c (1.8) まつもと ゆきひろです In message "Re: [ruby-dev:28598] bug of regex.c (1.8)" on Mon, 24 Apr 2006 18:10:40 +0900, KIMURA Koichi writes: |[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では対象がマルチバイト文字かどうかの判定をしていない |ので、マルチバイト文字をそのまま使ってテーブルを引いてしまっています。 |結果、ごみを使って変換することになっています。 | |とりあえずテーブルを引く前にマルチバイト文字かどうかを判定する必要が |あるのではないでしょうか? そのようですね。取り込みます。ありがとうございました。