在实际应用中我们难免遇到某些显示位置最多只能显示比如4个中文加1个英文,一共9个字节的gbk编码文字,但是我们文本是utf-8的,如果转换GBK,担心里面有非GBK文字,那么我们如何截取来控制显示字符个数呢?
思路是这样子:首先文本用unicode表示,python中用u"汉字和English"表示;如果是字母或数字,计数宽度单位为1,否则计数2,这样来判断文本显示宽度是否超标,如果超标,利用截取函数,一个一个的往后截取,直到显示宽度越界了,回退一个,截取这么多个unicode字符返回即可。
代码如下:
#coding=utf-8
def is_chinese(uchar):
'''判断一个unicode是否是汉字'''
if uchar >= u'\u4e00' and uchar<=u'\u9fa5':
return True
return False
def is_number(uchar):
"""判断一个unicode是否是数字"""
if uchar >= u'\u0030' and uchar<=u'\u0039':
return True
return False
def is_alphabet(uchar):
"""判断一个unicode是否是英文字母"""
if (uchar >= u'\u0041' and uchar<=u'\u005a') \
or (uchar >= u'\u0061' and uchar<=u'\u007a'):
return True
return False
def is_other(uchar):
"""判断是否非汉字,数字和英文字符"""
if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)):
return True
return False
# gbk宽度可用于对齐,中文占两个字符位置
def gbkwordlen(u):
if is_number(u) or is_alphabet(u):
return 1
return 2
# 计算文本显示宽度
def gbkwordslen(uw):
i = 0
for u in uw:
i += gbkwordlen(u)
return i
def trunc_word(uw, len):
l = 0
i = 1
for u in uw:
l += gbkwordlen(u)
if l > len:
return uw[:i-1]
i += 1
return uw
a = u"更新a至1209期"
print trunc_word(a, 6)
print gbkwordslen(a)