文字列を先頭からnバイトで区切る方法

文字列を先頭からnバイトで区切りたいことがたまにあると思う。このときに、日本語の中に半角が1文字混じってたりすると、区切りの境界にある日本語の文字が前側1バイトで切られてしまうことになり、なかなか厄介だ。


今日、ruby-list でこれの対処法が議論されてた。いくつか答えが返ってきてたけど青木さんの答えがシンプルでわかりやすかったので、メモっとく。

レシピブックを書いたときに調べたことがあります。そのとき思いついた方法で一番速かったのは、バイト長で切ってから正規表現でslice するやりかたです。

[最大 n バイト取り出す例]

  def take_nbytes(str, n)
    str[0, n].slice(/\A.*/)
  end

  $KCODE = 'SJIS'
  take_nbytes("あいうえお", 4)   # => "あい"
  take_nbytes("あいうえお", 5)   # => "あい"

なんでこれで取り出せるかというと、正規表現の「.」は中途半端なマルチバイト文字にマッチしないからです。だから最後の泣き別れ部分だけはマッチせず、切り捨てられます。


ruby-list:42978 - Re: 長い書名を短くするメソッド

take_nbytes() をModule にでもして、include してやるとかなり便利そうだ。
青木さんのメールには、文字列の最後からnバイトを取るコードも載ってたので、興味ある人は ruby-list のアーカイブを見てください。