読者です 読者をやめる 読者になる 読者になる

hotoolong's blog

Railsやvimや気になったことを綴ってます

Rubyでマルチバイト文字数を確認する

仕事でRuby1.8、Rails2.3とか使ってます。

たとえば、30文字以上はカットとかバイト数でじゃない場合、
マルチバイトを文字数でカットしたいときにいいものを教えてもらったので、メモメモ

ActiveSupportを利用

Railsの場合ですが、結構簡単にマルチバイト対応で処理できるようです。

詳しく調べてないですが、
ActiveSupport::Multibyte::CharsがStringをラップしてるようです。
これを使うとうまくいくのですが、
他のサイトを見てるとRubyだけでもうまくやっているようです。

1.9ならこんな苦労しなくてもいい??

>> a=''
=>""
>> a.size  #Stringのままだとサイズ3でbyte計算
=> 3
>> a.mb_chars
=> #<ActiveSupport::Multibyte::Chars:0x2b4abe6f7a78 @wrapped_string="あ">
>> a.mb_chars.size #Charsになったのでサイズ1で文字数で認識
=> 1

splitメソッドで分割

Rubyだけの場合は\uで分割してあげればいけるようです。
ただし中身がArrayになってるので、Stringに戻してあげて使ってください。

>> a=''
=> ""
>> a.split('//u').size
=> 1
>> a.split('//u')
=> [""]
>> a.split('//')
=> [""]
>> a.split('//u').class
=> Array

この辺は慣れの問題でしょうね。慣れてる人にとっては経験則ですり抜けていく感じでしょうか。
JavaのString#sizeとString#lengthの違いに似てるかも知れないです。