前言:html
這種需求並不經常使用,python主要用於爬取數據,對於數據有效性問題,應該在輸入以前就限制。例如QT輸入框可以限制,html輸入也能限制。java
對於c/c++、mysql等,普通字符佔1個字節,中文佔2個字節。只需直接求字節數就好。可是python並不是如此,python的len計算的長度僅僅是「字符數」的意思。python寫到mysql等有字節長度限制的庫裏就會出問題。python
l = '中國123' print(len(l)) #5
那麼如何知道真實字節長度呢?或者說,知道有多少箇中文呢?mysql
大部分的中文字符在\u4e00-\u9fa5間。用正則能夠識別出這些中文。只須要len一下結果就知道有多少箇中文。c++
實際字節數 = 中文數 + len(原字符串)sql
l = '個人34世界123' print(re.findall('([\u4e00-\u9fa5])',l)) #['我', '的', '世', '界']
可是這有個bug,雖然能獲取大部分中文,但一些中文字符或少用字是檢測不出來的數據庫
l = '個人34世¥界123' re.findall('([\u4e00-\u9fa5])',l) #['我', '的', '世', '界']
大多數時候,咱們並不須要提取中文,僅僅知道真實長度就夠了。(例如寫入有約束的數據庫之類的)後端
利用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
中文字符個數 = (解碼後字符個數 - 字符個數)//2spa
因爲每一箇中文字符數變成了3,因此。
實際在數據庫佔字節數 = 原字符數 + 中文個數
後記:
在python中,是幾乎沒有辦法徹底匹配出中文字符的。實際做用也不大。python主要用途仍是爬蟲客戶端。讀寫數據庫的事交給c java .net等後端去作爲佳。功能與數據與視圖分開,纔是正確的框架。