前言:
這種需求並不常用,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等後端去做爲佳。功能與數據與視圖分開,纔是正確的框架。