From: nobu.nakada@... Date: 2001-09-03T12:00:33+09:00 Subject: [ruby-dev:14624] Re: 大小文字を無視した比較で ' 帰 ' == ' 蟻 ' ? なかだです。 At Mon, 3 Sep 2001 07:58:23 +0900, matz@ruby-lang.org (Yukihiro Matsumoto) wrote: > | ・ Single-byte: 00-80 (*) > | ・ Two-byte: 81-fe | 40-7e, 80-fe > | ・ Four-byte: 81-fe | 30-39 | 81-fe | 30-39 > | > |とあります。4バイト文字か2バイト文字かが分かるのは2バイト目を > |読んだときのようですね。 > > ううう、サイテーのエンコーディングですね。既存のエンコーディ > ング(GBK?)をそのまま拡張したせいのようです。どうやって対応 > するかなあ。  m17n_mbclen()を使ってるところに関しては、だいたいバイト自体で はなくポインタを渡すようにしてもよさそうな気がします。  例外はio_readchar()ですが、バイト列が完結した文字になっている かを判断するもの(m17n_mbcspan()と似てるけど中途半端ならエラーに するとか)があればできそうな感じ。  あとはregex.cのPREV_IS_A_LETTER()がダメダメかも。これはSJIS hackと同じようにすればなんとかなるかも知れませんが、一般的には 逆方向に文字先頭を探すというインターフェースが必要なのかも。 WindowsにあるCharPrevEx()というのがそれっぽいですが。 # と、ついでにパッチ。 Index: regex.c =================================================================== RCS file: /cvs/ruby/src/ruby/regex.c,v retrieving revision 1.38.4.1 diff -u -2 -p -r1.38.4.1 regex.c --- regex.c 2001/01/12 04:36:00 1.38.4.1 +++ regex.c 2001/09/03 02:11:30 @@ -4017,5 +4017,5 @@ re_match(bufp, string_arg, size, pos, re else goto fail; } - if (AT_STRINGS_BEG(d)) { + if (AT_STRINGS_END(d)) { if (PREV_IS_A_LETTER(d)) break; else goto fail; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦