From: Vincent Isambart Date: 2008-01-20T18:42:03+09:00 Subject: [ruby-dev:33217] Re: each_char バンサンと申します。 On Jan 20, 2008, at 9:42 AM, Vincent Isambart wrote: > On Jan 20, 2008, at 8:57 AM, Tanaka Akira wrote: >> 以下のように、each_char が "bc" とか 1文 >> 字でないものを yield >> します。 >> >> % ./ruby -ve 's = "\xa4\xa2bc".force_encoding("euc-jp"); >> s.each_char {|x| p x }' >> ruby 1.9.0 (2008-01-19 revision 0) [i686-linux] >> "あ" >> "bc" >> "c" > > 問題は前の字の長さが使われていた事です。 > rb_enc_mbclenの正しい使い方はよくわからないですけど以下の > パッチはこの問題を修正するみたいです。 この前のパッチはyieldの後に文字列の長さを改めて参考する 事を忘れていました。 もっと正しいパッチはこのようです: Index: string.c =================================================================== --- string.c (revision 15142) +++ string.c (working copy) @@ -4595,17 +4595,14 @@ rb_encoding *enc; RETURN_ENUMERATOR(str, 0, 0); - ptr = RSTRING_PTR(str); len = RSTRING_LEN(str); - enc = rb_enc_get(str); - n = rb_enc_mbclen(ptr, ptr + len, enc); for (i = 0; i < len; i += n) { - rb_yield(rb_str_subseq(str, i, n)); ptr = RSTRING_PTR(str); - len = RSTRING_LEN(str); enc = rb_enc_get(str); s = rb_enc_left_char_head(ptr, ptr + i, enc); n = rb_enc_mbclen(s, ptr + len, enc); + rb_yield(rb_str_subseq(str, i, n)); + len = RSTRING_LEN(str); } return str; }