From: Vincent Isambart Date: 2008-01-20T17:42:22+09:00 Subject: [ruby-dev:33213] Re: each_char バンサンと申します。 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の正しい使い方はよくわからないですけど以下のパッ チはこの問題を修正するみたいです。 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)); } return str; }