sizeメソッドやlengthメソッドは文字列長ではなくバイト長を取得するらしい。
p "ぬるぽ".size # => 9
UTF-8では、マルチバイト文字の2バイト目以降の上位2ビットは必ず10になるので、こんな感じで文字列長が取れるだろうか。
def utf8length(str) str.unpack("C*").inject(0){ |r, b| r += 1 if ((b & 0xC0) != 0x80); r} end p utf8length("ぬるぽ") # => 3
そして、jcodeなるライブラリが標準添付されていることに気付いた。
require 'jcode' $KCODE = "u" p "ぬるぽ".jsize # => 3
覚える順番を間違っている気がする。