【python】含中文字符串截断

对于含多字节的字符串,进行截断的时候,要判断截断处是几字节字符,不能将多字节从中分割,避免截断后乱码

 

下面给出utf8和gb18030上的实现, 用任何一种都可以,可以先进行转码,用encode, decode;

 

方法1:对utf8:  参考:http://blog.csdn.net/marising/article/details/3452971

def subString(string,length):
    if length >= len(string):
                return string

    result = ''
    i = 0
    p = 0

    while True:
                ch = ord(string[i])
                #1111110x
                if ch >= 252:
                        p = p + 6
                #111110xx
                elif ch >= 248:
                        p = p + 5
                #11110xxx
                elif ch >= 240:
                        p = p + 4
                #1110xxxx
                elif ch >= 224:
                        p = p + 3
                #110xxxxx
                elif ch >= 192:
                        p = p + 2
                else:
                        p = p + 1   
        
                if p >= length:
                        break;
                else:
                        i = p

    return string[0:i]

 

方法2:对gb18030编码

def cut_string_off(string,s_len):
        if len(string)==0 or s_len <=0:
                return string

        elif len(string)==1 or s_len >= len(string):
                return string

        elif s_len < len(string):
                len_num=0
                while len_num < s_len:
                        tmp_c=ord(string[len_num])
                        if tmp_c >0 and tmp_c <=0x7F:
                                len_num+=1
                                continue

                        tmp_nextc=ord(string[len_num+1])
                        if tmp_c >= 0x81 and tmp_c <=0xFE and tmp_nextc>=0x40 and tmp_nextc<=0xFE:
                                len_num+=2
                                continue

                        else:
                                len_num +=1;
                                continue

                        break

                tmp = string[0:len_num]
#       print utf2gbk(tmp)
        return tmp

  

转载于:https://www.cnblogs.com/liyuxia713/p/3518689.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值