島田と申します

SJISで、全角と半角が混じっている文字列の左からnバイトまたは
右からnバイトを切り出すメソッドを作って見ました。

みそは切り出す文字の境界に全角文字がきて1バイトめと2バイト目
が泣き別れになるのを避けることです。そのような状況では切り出
す長さをn-1もじにして処理しています。
-----------------------------------ここから開始
$KCODE='s'
require 'jcode'

class String
    # SJISで左のnバイトを切り出す。
    # 境界に2バイト文字がある時は長さをn-1バイトにする。
    #
    # $KCODE='s'; require 'jcode'がこの行以前にあることが前提
    def jleft(n)
        if self.length <= n
            xx = self.dup
        else
            if self[0..(n-1)].jlength == self[0..n].jlength
                #境目に2バイト文字がある
                xx = self[0..(n-2)]
            else
                xx = self[0..(n-1)]
            end
        end
        xx
    end

    # SJISで右のnバイトを切り出す。
    # 境界に2バイト文字がある時は長さをn-1バイトにする。
    def jright(n)
        if self.length <= n
            xx = self.dup
        else
            n = self.length - n
            if self[0..(n-1)].jlength == self[0..n].jlength
                #境目に2バイト文字がある
                xx = self[(n+1)..-1]
            else
                xx = self[n..-1]
            end
        end
        xx
    end
end
#-------------------ここからテスト
cc = "ABCDEF"
(1..cc.length).each {|n|
    xx = cc.jleft(n)
    print xx, "(", n, ")\n"
}

(1..cc.length).each {|n|
    xx = cc.jright(n)
    print xx, "(", n, ")\n"
}


__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/