home changes contents help options

067:文字列を最大n桁に切り詰める

unicodedata モジュールより、 East Asian Width 情報を利用しています。

# coding: utf-8
from unicodedata import east_asian_width

_east_asian_width = {
        'Na': 1,
        'N': 1,
        'W': 2,
        'H': 1,
        'A': 2,
        }
def take_ncols(s, n):
    length = 0
    result = []
    for c in s:
        length += _east_asian_width[east_asian_width(c)]
        if length > n:
            break
        result.append(c)
    return u''.join(result)

def test():
    print take_ncols(u'a'* 30, 20)
    print take_ncols(u'あ'* 30, 20)
    print take_ncols(u'a'* 15 + u'あ' * 15, 20)

if __name__ == '__main__':
    test()

Shift JIS ではバイト数と表示幅が一致することを利用する方法もあります。こちらについては 065:文字列を最大nバイトに切り詰める を参照してください。

参考