python2編碼的問題
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編碼的問題