前言:
这种需求并不常用,python主要用于爬取数据,对于数据有效性问题,应该在输入之前就限制。例如QT输入框能够限制,html输入也能限制。
对于c/c++、mysql等,普通字符占1个字节,中文占2个字节。只需直接求字节数就好。但是python并非如此,python的len计算的长度仅仅是“字符数”的意思。python写到mysql等有字节长度限制的库里就会出问题。
l = '中国123'
print(len(l))
#5
那么如何知道真实字节长度呢?或者说,知道有多少个中文呢?
方法1:正则识别中文法
大部分的中文字符在\u4e00-\u9fa5间。用正则可以识别出这些中文。只需要len一下结果就知道有多少个中文。
实际字节数 = 中文数 + len(原字符串)
l = '我的34世界123'
print(re.findall('([\u4e00-\u9fa5])',l))
#['我', '的', '世', '界']
但是这有个bug,虽然能获取大部分中文,但一些中文字符或少用字是检测不出来的
l = '我的34世¥界123'
re.findall('([\u4e00-\u9fa5])',l)
#['我', '的', '世', '界']
方法2:解码
大多数时候,我们并不需要提取中文,仅仅知道真实长度就够了。(例如写入有约束的数据库之类的)
利用encode可以知道解码后uncode文本。但是中文字符长度会变成3!
l = '我的世¥界123'
#字符个数
print(len(l))
#8
#字符解码
print(l.encode())
#b'\xe6\x88\x91\xe7\x9a\x84\xe4\xb8\x96\xef\xbf\xa5\xe7\x95\x8c123'
#解码后字符个数
print(len(l.encode()))
#18
#中文个数
print((len(l.encode())-len(l))//2)
#5
#数据库占字节数
print(len(l)+(len(l.encode())-len(l))//2)
#13
中文字符个数 = (解码后字符个数 - 字符个数)//2
由于每个中文字符数变成了3,所以。
实际在数据库占字节数 = 原字符数 + 中文个数
后记:
在python中,是几乎没有办法完全匹配出中文字符的。实际作用也不大。python主要用途还是爬虫客户端。读写数据库的事交给c java .net等后端去做为佳。功能与数据与视图分开,才是正确的框架。