python的字元編碼問題

2021-09-13 18:17:51 字數 2290 閱讀 9288

總是把python的編碼問題搞得很混亂,現在整理一下,免得以後再忘記。。。

常見的字元編碼有 ascii 編碼,gbk 編碼,unicode 編碼和 utf-8 編碼等等。

ascii編碼是最開始美國使用的,乙個位元組(八個位)代表乙個字元。比如大寫英文本母 a 的二進位制表示是 01000001(十進位制 65)。

unicode編碼的出現原因是ascii編碼推向全球時,乙個位元組不能完成所有國家字元的表示,所以需要更多的位元組來表示乙個字元。unicode統一使用多個位元組表示乙個字元必然會造成資源的浪費,所以utf-8就出現了。

utf-8 (8-bit unicode transformation format) 是一種針對 unicode 的可變長度字元編碼,它使用一到四個位元組來表示字元,例如,ascii 字元繼續使用乙個位元組編碼,阿拉伯文、希臘文等使用兩個位元組編碼,常用漢字使用三個位元組編碼,等等。

python2 的預設編碼是 ascii,python3 的預設編碼是 utf-8,可以通過下面的方式獲取:

python2 中有兩種和字串相關的型別:str 和 unicode,它們的父類是 basestring。其中,str 型別的字串有多種編碼方式,預設是 ascii,還有 gbk,utf-8 等,unicode 型別的字串使用 u』…』 的形式來表示,下面的圖展示了 str 和 unicode 之間的關係:

所以一般的字串的編碼型別的轉換就是在str和unicode之間進行轉換

decode(『utf-8』)表示解碼utf-8,使其編碼型別為unicode

encode(『utf-8』)表示編碼成utf-8,使其編碼型別為utf-8

>>> '中文'.decode('utf-8') #將『中文』解碼成unicode

u'\u4e2d\u6587'

>>> u'中文'.encode('utf-8') #將中文編碼成utf-8

'\xe4\xb8\xad\xe6\x96\x87'

所以decode和encode一般只用於unicode和utf-8之間的轉換,當涉及到str內的編碼型別轉換時,需要使用unicode作為媒介,如

s=

'中國'

#gbk

n=s.decode(

'gbk'

)#這裡將gbk轉成了unicode

m=n.encode(

'utf-8'

)#再將unicode轉成utf-8

#coding=utf-8
這個東西是幹啥的呢?

python的指令碼檔案預設編碼都是ascii,當我們在指令碼**現ascii碼無法表達的字元時,咋辦?比如指令碼**現中文。這時就需要上面這行**告訴指令碼,這個中文你ascii搞不定,那我用utf-8吧,這樣就不會報錯了。當然,也可以用gbk等編碼方式。

import sys

reload

(sys)

sys.setdefaultencoding('utf-

8)

上面這個又是幹啥的?

前面我們講了,當進行str型別轉換時,需要使用unicode作為媒介,先解碼成unicode,再編碼成相應的str型別:

#coding=utf-8

s='中國'

#因為設定了#coding=utf-8,所以s的型別是utf-8

s_gbk=s.decode(

'utf-8'

).encode(

'gbk'

)#這裡就是先將utf-8轉成unicode,再轉成gbk

那如果直接encode(『gbk』)行不行?

直接這樣做是不行的,因為如果執行s_gbk=s.encode(『gbk』),這裡python會預設先將s解碼成unicode,但是python預設編碼是ascii,所以在不適用decode(『utf-8』)的情況下,python會認為s是ascii,所以會預設執行s.decode(『ascii』),但是我們知道s的型別是utf-8,所以這裡就會報錯啦。

因此想省事的話,sys.setdefaultencoding(『utf-8』)就會告訴python,這裡的s是utf-8,別給我當成ascii,這樣的話,直接執行s.encode(『gbk』)就可以啦。

對於windows來說,print乙個中文字元,需要將中文字元轉成unicode。

python的字元編碼問題

最近因為專案需要用到python指令碼,趕緊學習了一下。今天碰到乙個問題,做下筆記。就是出現類似 non utf 8 code starting with xb6 in file xx.py 這樣的報錯,錯誤原因網上都有解釋 是python的檔案編碼問題,因此根據官方提示,需要加入 coding 你...

Python字元編碼問題

寫python經常受到字元編碼的困擾,此問題主要是在2.x中.因為2.x中的字串有兩種型別 str和unicode,它們共同的祖先是basestring.下面的經驗主要是基於windows上面的python2.x,使用macos可以減少許多不必要的煩惱.之所以經常出現字元亂碼,有以下幾點原因 pyt...

Python 字元編碼問題

在做自動化測試過程中,總是遇到編碼問題,總結以下幾點 1 在python指令碼中想要有中文出現,比如中文注釋,解決方法 在檔案的頭部加上 coding utf 8 2 想要實現writelines能夠寫入中文 a.file.writelines u 中文 b.str 這裡輸入中文 file.writ...