my story blog

JavaScriptとかRubyの技術的なことを書きたい

Rubyで全角文字列を2バイトとして数えたい

Ruby(1.9以上)でエンコードUTF-8として利用している場合、 Stringのbytesizeメソッドは基本的にマルチバイトを3バイトして返します。*1

"abc123){*~".bytesize #=>10
"あイ冬".bytesize #=>9

やりたいこと

等幅のフォントを利用して、文字列と空白を組み合わせ固定長のような形式の 文字列にしたい。 そのため、全角文字は2(半角2文字分なので)、半角文字は1として文字列をカウントしたい。

例えば

  • "漢字"という文字列は4
  • "ab"という文字列は2
  • "全角space"という文字列は9

というような具合です。

コード

以下の様なget_exact_sizeメソッドを作成しました。

https://gist.github.com/7541358

というような方法で 全角→2、半角→1という方法で取得出来ました。

count_multi_byteはおまけで作りました。

もっといい方法があればコメント下さい。

参考:マルチバイト文字を含む文字列の表示桁数を合わせる - 紅孔雀

*1:一部4バイトとして返す文字列もあります : http://www.softel.co.jp/blogs/tech/archives/596