1. 程式人生 > >python2編碼的問題

python2編碼的問題

src 顯示 nbsp -c 都是 一點 如果 問題 數據模型

1,python2的默認編碼是ascii碼。

2,python2中有2中數據模型來支持字符串這種數據類型,分別為str和unicode。

3,uncode轉換為其他編碼是encode,其他編碼轉換成unicode是decode(解碼)。所以unicode是核心,比如你現在有個gbk的字符串,如果想要變成utf-8,那你需要先decode然後在encode才行。

技術分享圖片

4,文件開頭聲明的編碼與定義str是有關系的。str有utf-8 gbk gb2312 ascaii等。

比如:

#!/usr/bin/env python
# *-*coding:utf-8 *-*
s = ‘中國‘
print(type(s))

                結果:<type ‘str‘>

  可以發現s是一個字符串,但其實它的編碼也是utf-8,因為開頭的聲明變量就是utf-8。

#!/usr/bin/env python
# *-*coding:utf-8 *-*
s = ‘中國‘
print(type(s))
data = s.decode(‘utf-8‘)
print(data)
print(type(data))

              結果:
<type ‘str‘>
中國
<type ‘unicode‘>

 可以發現s.decode(‘utf-8’)就將s解碼為unicode,這個時候data就可以編碼為其他的格式了。

比如:

#!/usr/bin/env python
# *-*coding:utf-8 *-*
s = ‘中國‘
print(type(s))
s_unicode = s.decode(‘utf-8‘)
s_gbk = s_unicode.encode(‘gbk‘)

 

上述結果會輸出一個gbk編碼的字符串,但是可能會顯示亂碼。這個取決於你的終端。如果你使用的是windows 的cmd窗口,默認是gbk的話,就會顯示出來了,但是如果你使用的是linux的終端或者pycharm運行會亂碼。

5,上面說到一點,python2默認使用的是ascii碼作為默認編碼,所以會有一個問題。如下:

技術分享圖片

這就納悶了,我剛剛明明是編碼,為啥會顯示解碼呢?就算是解碼為啥會是ascii碼呢?這個就和Python2麽默認編碼有關系了。

因為python2默認在我編碼的時候用默認的ascii碼給我解碼,所以

s.encode(‘utf-8‘) 過程是 s.decode(‘ascii‘).encode(‘utf-8‘ ) ,而s沒辦法解碼為unicode。因為它其實本質上是utf-8,所以這也就無法解碼了,報錯了。

這就是默認編碼的尷尬之處。

6,文件操作

python2操作文件,會經常報錯。。。。。。。。。這就是因為咱們沒搞清楚。所以,下面就談談自己的粗淺想法。

操作文件,建議使用codecs這個模塊,非常方便。codecs提供open方法,open()方法可以指定編碼格式。

使用這個方法打開這個文件讀取返回都是unicode。寫入時,如果write參數是unicode。則使用打開文件時的編碼寫入,如果是str,則先使用默認編碼解碼成unicode後再以打開文件的編碼寫入

這裏需要註意的是如果str是中文,而默認編碼sys.getdefaultencoding()是ascii的話會報解碼錯誤。

技術分享圖片

從上面可以發現默認打開文件,它會自動編碼,如果沒有指定編碼,這個時候他用又得用默認編碼,所以過程是s.encode(‘ascii‘) 所以這就不報錯了嗎?

所以寫入的時候就指定編碼就可以了。於是乎:

技術分享圖片

這樣就可以避免報錯了。

下面是讀取,可以發現讀取,是unicode編碼。文件流.decode(‘utf-8‘)

技術分享圖片

上面作為自己的筆記,可能有錯誤哦。

python2編碼的問題