簡單記錄幾點,以備後忘:
1、python 中的默認編碼方式爲ascii
In [1]: import sys In [2]: sys.getdefaultencoding() Out[2]: 'ascii'
2、設置python 中的默認編碼方式
In [1]: import sys In [2]: reload(sys) <module 'sys' (built-in)> In [3]: sys.setdefaultencoding('utf-8') In [4]: sys.getdefaultencoding() 'utf-8'
3、python 頭頂部設置的編碼格式 # _*_ coding: utf-8 _*_ 不會影響默認python 的默認編碼格式
#! /usr/bin/env python # _*_ coding: utf-8 _*_ import sys print sys.getdefaultencoding()
執行後的結果爲 ascii 編碼格式
那麼python 頭頂部設置的編碼格式有什麼作用呢?
#1、如果代碼中有中文註釋,就需要此聲明
#2、比較高級的編輯器(比如我的emacs),會根據頭部聲明,將此作爲代碼文件的格式
#3、程序會通過頭部聲明,解碼初始化 u"人生苦短",這樣的unicode對象,(所以頭部聲明和代碼的存儲格式要一致)
以上觀點來自於 http://python.jobbole.com/81244/ 此文
那做個測試吧:
#! /usr/bin/env python # _*_ coding: utf-8 _*_ import sys print sys.getdefaultencoding() #reload(sys) #sys.setdefaultencoding('utf-8') # 會被編碼爲unicode s1 = u"這是一個測試1" # 會被編碼爲ascii s2 = "這是一個測試2" s1.encode('gbk') s2.encode('gbk') print s1 print s2
以上測試結果:
ascii Traceback (most recent call last): File "testunicoding.py", line 21, in <module> s2.encode('gbk') UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 0: ordinal not in range(128)
主要s2這個字符串的默認編碼格式爲ascii ,無法先decode 成unicode 。出了問題
將默認編碼方式更改爲utf-8後
#! /usr/bin/env python # _*_ coding: utf-8 _*_ import sys print sys.getdefaultencoding() reload(sys) sys.setdefaultencoding('utf-8') print sys.getdefaultencoding() # 會被編碼爲unicode s1 = u"這是一個測試1" # 會被編碼爲ascii s2 = "這是一個測試2" s1.encode('gbk') s2.encode('gbk') print s1 print s2
執行結果:
ascii utf-8 這是一個測試1 這是一個測試2