python2編碼的問題

2022-01-15 10:23:51 字數 2178 閱讀 5437

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))

結果:

可以發現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))

結果:中國

可以發現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編碼問題

以下內容說的都是 python 2.x 版本 我們看到的輸入輸出都是 字元 characters 計算機 程式 並不能直接處理,需要轉化成位元組資料 bytes 因為程式只能處理 bytes 資料。例如 檔案 網路傳輸等,處理的都是 bytes 資料 二進位制數字。孤立的 byte 是毫無意義的,所...

Python2編碼問題

以下內容說的都是 python 2.x 版本 我們看到的輸入輸出都是 字元 characters 計算機 程式 並不能直接處理,需要轉化成位元組資料 bytes 因為程式只能處理 bytes 資料。例如 檔案 網路傳輸等,處理的都是 bytes 資料 二進位制數字。孤立的 byte 是毫無意義的,所...

python2 編碼問題

coding utf 8 import sys reload sys sys.setdefaultencoding utf8 第一行是讓 以utf8格式解析 後面三行是讓python直譯器在decode時候用utf8進行decode 這樣所有字串都是utf8的了,如果遇到非utf8字串可以用deco...