早期編碼都用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'>>> 由于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 更加詳細正則匹配內容,可以看看這篇博文
內容參考:廖雪峰大神的博文 知乎上的回答:Unicode和UTF-8有何區別?鏈接
補充:
今天偶然看見篇博文,對python2.7編碼錯誤與原理分析很到位。PYTHON-進階-編碼處理小結
新聞熱點
疑難解答