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

From: Minero Aoki <aamine@...>
Date: 2006-11-06 16:15:54 UTC
List: ruby-list #42978
青木です。

  In mail "[ruby-list:42975] 長い書名を短くするメソッド"
  keiichi matsunaga <ma2@lifemedia.co.jp> wrote:

>  松永です。

> 問題は4)の段階で,何も考えずに str[0,10] などとやると,漢字の真ん中で
> 切れる,いわゆる泣き別れが起きる可能性があるということです。バイト数と
> 文字数の両方を意識しながら文字を取り出すにはどういう方法があるのでしょ
> うか?

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

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

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

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

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

また、後ろから n バイト取る場合は、かずひこさんも書いていた文字
分割と組み合わせて、次のようにすればいいんじゃないかと思います。

  def take_last_nbytes(str, n)
    mbreverse(take_nbytes(mbreverse(str), n))
  end

  def mbreverse(str)
    str.split(//).reverse.join('')
  end

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


# 参考: レシピブック [065]「文字列を最大 n バイトに切り詰める」
# 自分でも見るまで忘れてた (笑)

--
青木峰郎

In This Thread