Python程序员面试算法宝典---解题总结: 第5章 5.21 如何截取包含中文的字符串

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第5章 5.21 如何截取包含中文的字符串

题目:
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节数截取的字符串。
但要保证汉字不被截半个,例如"人ABC" 4,应该截为"人AB",
输入"人ABC"而并不是"人ABC+们的半个"

分析:
当encoding为utf8时,一个中文占据3个字节。
可以将中文转换成unicode编码,然后用于判断是否是中文
另外中文的判断方式是:
字符在
"\u4e00"和"\u9fa5"分别是中文编码起始的两个字符

关键:
1 书上解法
中文的判断方式是:
字符在
"\u4e00"和"\u9fa5"分别是中文编码起始的两个字符

2
    for char in chars:
        if isChineseChar(char):
            # 这里i表示的长度,所以等号要取到
            if i + 3 <= size:
                # 注意这一个字符就占据3个字节,所以直接加上当前字符
                result = result + char
                i += 3

3 之所以没想到
是因为需要对每个字符进行判定,如果是中文,
则计数长度需要累加3,然后遍历下一个字符

参考:
Python程序员面试算法宝典
'''


def isChineseChar(char):
    # 注意,这里必须加上u''这个前缀
    if char >= u'\u4e00' and char <= u'\u9fa5':
        return True
    else:
        return False


def spilitStr(string, size):
    if not string or size <= 0:
        return u""
    # 这里不能直接转换为字符列表,因为这样会导致一个中文只占据一个字符
    chars = string
    i = 0
    result = ""
    # 这里需要遍历每个字符,因此用for循环
    for char in chars:
        # 判断如果是中文字符,并可以截取连续3个字符,就放入结果列表中
        if i >= size:
            break
        if isChineseChar(char):
            # 这里i表示的长度,所以等号要取到
            if i + 3 <= size:
                # 注意这一个字符就占据3个字节,所以直接加上当前字符
                result = result + char
                i += 3
            else:
                # 说明整个中文字符无法被包含,直接退出循环
                break
        else:
            # 英文字符,直接加入到结果列表中
            result = result + char
            i += 1
    return result


def toUnicode(string):
    if isinstance(string, str):
        # str是二进制,所以需要解码变成unicode
        string = string.decode('utf8')
    return string


def process():
    string = "人ABC们DE"
    # 先换转为unicode编码
    string = toUnicode(string)
    print type(string)
    size = 4
    result = spilitStr(string, size)
    print result
    size = 6
    result = spilitStr(string, size)
    print result
    size = 7
    result = spilitStr(string, size)
    print result
    size = 8
    result = spilitStr(string, size)
    print result
    size = 9
    result = spilitStr(string, size)
    print result



if __name__ == "__main__":
    process()

 

你可能感兴趣的:(Python程序员面试算法宝典)