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バイトに切り詰める を参照してください。