マルチバイトの文字列長を取得

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

覚える順番を間違っている気がする。