python2.7 編碼問題解析(二)

代碼文件的存儲,有一個編碼類型;
代碼運行的時候,加載到內存,有一個Python平臺的編碼類型;
打印輸出到屏幕的時候,有個屏幕的編碼類型;


默認的Python2.7用的是ascii的編碼類型,在不做任何代碼文件聲明的時候,Python平臺,把代碼文件當做ascii編碼類型的文件直接加載。
可想而知,當代碼文件中存在非ascii編碼的字符的時候,肯定報錯,識別不了。如果是用數字表示的編碼,就不會報錯。


當在代碼文件的開頭加上聲明如:“#-*-coding:utf8-*-”的編碼聲明的時候,Python平臺就會按照utf8的編碼格式來理解源代碼文件,並解釋到Python平臺的ascii編碼。這裏應當注意,原代碼文件聲明爲utf8編碼,則其文件,就應當按照utf8的格式來存儲,不然就成掛羊頭賣狗肉了。Python平臺一樣不會做出正確的理解。


第一種情況 所有的編碼都採用utf8的時候

1、設置cmd編碼格式爲utf8,並設置字體。

命令爲:chcp 65001

2、代碼文件如下

#-*-coding:utf8-*-

str1 = '人生苦短'
print '#' + str1
3、將代碼文件保存爲utf8格式。


源代碼的編碼聲明格式,源代碼的保存編碼格式,Python平臺的編碼格式,cmd的顯示編碼格式,這幾着如果不一致都會導致顯示有問題。

舉幾個例子。

第二種情況 其他編碼都不變,將cmd的編碼改爲gbk,也就是936

1、設置cmd編碼格式爲gbk

命令爲:chcp 936

2、測試如下代碼

#-*-coding:utf8-*-

str1 = '人生苦短'
print '#' + str1
print '#' + str1.decode('utf8').encode('gbk')
第二個打印語句能夠正確的顯示,gbk只是針對的中文的編碼,因此cmd的顯示編碼範圍是utf8的一個子集,因而第一個打印語句不能正確的顯示。

由於原代碼文件以utf8存儲,並且聲明爲utf8的編碼格式,因此Python平臺將其按照utf8格式翻譯爲平臺所需的ascii格式進行程序的調用。

str1是str對象,其字節序列是utf8格式的,而cmd要正確顯示所需要的是gbk格式的字節序列。因此做如下的轉換:

str1 經解碼變爲utf8格式的unicode對象,

utf8格式的unicode對象經gbk格式的編碼轉換爲gbk格式的字節序列。

最後輸出就能正確顯示。


再看一種情況,這種情況比較有意思:

1、cmd編碼格式設置:chcp 936

2、代碼的存儲格式爲

#-*-coding:windows-1252-*-

str1 = 'ÈËÉú¿à¶Ì'
str2 = u'ÈËÉú¿à¶Ì'

print '#' + str1
print [str2]
print '#' + str2.encode('windows-1252')


執行後,依然能夠正確的額打印輸出。爲什麼?




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章