python之中文字符串分割问题

背景

现有人员的姓名,希望通过字符串分割,分别获取人员的姓和名。(默认都是单姓,即取第一个字就是姓,剩下的为名)。

由于python2存在中文字符编码问题,并非默认都是utf-8,所以在进行字符串截取时就可能存在问题。

1
2
3
4
5
name = '郑小凯'
print(name[0])

print(name[1:])
��小凯

发现就出现乱码了。

排查

不通过print输出的话:

1
2
3
4
5
6
name
'\xe9\x83\x91\xe5\xb0\x8f\xe5\x87\xaf'
name[0]
'\xe9'
name[1:]
'\x83\x91\xe5\xb0\x8f\xe5\x87\xaf'

可见由于python2中中文的编码为gbk,两个字符才是一个汉字,所以导致了乱码。

那么我们将字符转换成Unicode类型,即utf-8编码后再尝试一下:

1
2
3
4
5
6
7
name1 = name.decode('utf-8')
name1
u'\u90d1\u5c0f\u51ef'
print(name1[0])

print(name1[1:])
小凯

这样就得到我们想要的结果。

结论

在utf-8编码中,每个汉字都是一个值,所以可以直接使用字符串分割来操作。而其他编码则存在多个字符合并起来才是一个汉字,导致字符串分割出现乱码问题。

故在python2中,对中文汉字进行字符串分割需要先通过decode转换成utf-8类型之后再操作,后续如有需要可以再通过encode转换回所需要的编码类型。

现在基本上在http请求中传递的均为utf-8类型,可以直接使用字符串分割处理。

当然后续可以的话还是建议使用python3,彻底摆脱中文字符串编码的问题。