大家好,又見面了,我是你們的朋友全棧君。
###字符串的編碼亂碼問題由來已久,真的是令人頭疼。這不是在做正則匹配中文時候,編碼又一次成了攔路虎,在這兒記錄兩點。第一,字符串編碼。第二,正則匹配中文。
早期編碼都用ASCII編碼,用一個字節來處理編碼。如大寫A編碼為65,但處理中文時候,一個字節顯然不夠,至少兩哥字節,還不能和ASCII沖突,,中國制定GB2312編碼,把中文編進去。 類似的,韓國,日本都出來格子標准,結果就是多語言 混合的文本中會出現亂碼。 因此,Unicode應運而生。Unicode把所有語言都統一到一套編碼裡,這樣就不會再有亂碼問題了。 因此,Unicode應運而生。Unicode把所有語言都統一到一套編碼裡,這樣就不會再有亂碼問題了。 新的問題又出現了:如果統一成Unicode編碼,亂碼問題從此消失了。但是,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上就十分不劃算。
所以,本著節約的精神,又出現了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間 Python添加對Unicode的支持,以Unicode表示的字符串用u’ABC’來表示。 字符串’xxx’雖然是ASCII編碼,但也可以看成是UTF-8編碼,而u’xxx’則只能是Unicode編碼。 把u’xxx’轉換為UTF-8編碼的’xxx’用encode(‘utf-8’)方法。
>>> u'ABC'.encode('utf-8')
'ABC'
>>> u'中文'.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87
反過來,把UTF-8編碼表示的字符串’xxx’轉換為Unicode字符串u’xxx’用decode(‘utf-8’)方法。
>>> 'abc'.decode('utf-8')
u'abc'
>>> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
u'\u4e2d\u6587'
>>> print '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
中文
由於Python源代碼也是一個文本文件,所以,當你的源代碼中包含中文的時候,在保存源代碼時,就需要務必指定保存為UTF-8編碼。當Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
第一行注釋是為了告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個注釋;
第二行注釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。
關於Python正則表達式匹配中文,其實只要同意編碼就行,我電腦用的py2.7,所以字符串前加u,在正則表達式前也加u即可。
str=u"【心理箴言】現實是污濁的河流,要想接受污濁的河流而自身不被污染,我們必須成為大海。 =-=4845/.?'"
# pattern =re.compile(u'[\u4e00-\u9fa5]')
pattern =re.compile(u"[\u4e00-\u9fa5]+")
result=re.findall(pattern,str)
# print result.group()
for w in result:
print w
更加詳細正則匹配內容,可以看看這篇博文
內容參考:廖雪峰大神的博文
補充:
今天偶然看見篇博文,對python2.7編碼錯誤與原理分析很到位。PYTHON-進階-編碼處理小結
發布者:全棧程序員棧長,轉載請注明出處:https://javaforall.cn/128943.html原文鏈接:https://javaforall.cn