總結總結,本文僅適用於python2.xpython
首先是開頭的地方聲明編碼windows
# coding: utf8運維
這個東西的用處是聲明文件編碼爲utf8(要寫在前兩行內),否則文件裏若是有中文,好比編碼
a = '美麗' b = u'美麗'
中任何一種,運行前就會提示你SyntaxError
,Non-ASCII character... 之類,由於python2.x的文件編碼默認使用萬惡的ascii
開頭加上那句默認編碼聲明就會變成utf8
,獲取當前的默認編碼code
sys.getdefaultencoding()
在python中,使用unicode類型做爲編碼的基礎類型,編解碼要以其爲中間形式過渡,即進行str
和unicode
之間的轉換。
解碼而後再編碼的過程,即str
->unicode
->str
的過程。中間獲得的叫作unicode對象對象
這裏須要強調的是unicode
是一種字符編碼方法,是 「與存儲無關的表示」,而utf8
是一種以unicode
進行編碼的計算機二進制表示,或者說傳輸規範。gbk,gb2312,gb18030, utf8等屬於不一樣的字符集,轉換編碼就是在它們中的任意二者間進行。utf-8
具體的轉換,好比直接將一個字符串encode成另外一種字符集表示,注意此處是字符串,即type
爲str
的,引號前沒有加u
前綴的ci
# coding: utf8 s='美麗' s.encode('gbk')
則實際上會先以默認編碼進行decode
,即decode('ascii')
,開頭聲明瞭utf8,s
的編碼就是utf8
,ascii解碼不了utf8
的字符會報錯。那就改默認編碼,unicode
# coding: utf8 import sys reload(sys) sys.setdefaultencoding('utf-8') s='美麗' s.encode('gbk')
這樣把默認編碼改爲utf8,decode
的時候就以默認編碼utf8來進行,可以成功運行字符串
或者decode
時指定類型,
# coding: utf8 import sys s='美麗' s.decode('utf8').encode('gbk')
對於type
爲unicode
的,即加了u
前綴的字符串,如上所說,直接encode
便可
# coding: utf8 import sys s = u'美麗' s.encode('gbk')
這又是另外一個讓人困惑的地方——控制檯的編碼致使的亂碼問題甚至是報錯。通常我的用的電腦上控制檯基本上都是utf8
編碼的,但運維的機器上基本全是ascii
,print中文的時候就會有酸爽的問題。亂碼問題通常發生在windows
下面,由於那個編碼的字符集很不同凡響。因此當以正確方式編解碼之後,仍是出現問題,那問題極可能就出在控制檯上了