之前一直對python檔案中編碼解碼糊里糊塗,今天看到一篇文章,覺得把我講的有點明白了。寫個心得吧。
1、編碼解碼是怎麼一回事?
python 裡面的編碼和解碼也就是 unicode 和 str 這兩種形式的相互轉化。
編碼是 unicode -> str,相反的,解碼就是 str -> unicode。
str形式,也就是字串形式都是以一定的編碼格式存在的,常見的編碼格式有utf-8、ascii、gb2312等等。
str1.decode(『gb2312』),表示將gb2312編碼的字串str1解碼成unicode。
str2.encode(『utf-8』),表示將unicode字串str2轉換成用utf-8格式編碼的字串。
不同編碼格式的字串之間相互轉換編碼格式的話,都要先解碼成unicode,再編碼成其他編碼格式的字串。就拿上面的str1來說,將str1轉成utf-8編碼的字串,需要這麼做:
str1.decode(『gb2312』).encode(『utf-8』)。
2、如何在python檔案中指定編碼、解碼格式呢
我們在編寫python指令碼的時候,通常在#! /usr/bin/env python下面一行指定該py檔案的預設編碼格式。比如# coding=utf-8,表示該py檔案中的字串都是以utf-8格式編碼的。
而sys.defaultencoding則指明了預設的字串解碼方式。在解碼時沒有明確指明解碼方式的時候使用。
還要記住一點,字串用什麼格式編碼,就要用相同的格式解碼才能變成unicode。
3、編碼解碼格式要一致
! /usr/bin/env python
-- coding: utf-8 --
s = '中文' # 這裡的 s 是utf-8編碼的字串型別
s.encode('gb18030') 1234
觀察上面的**,我們預計會報錯誤。因為第二行指定了該py檔案裡面的字串預設編碼格式是utf-8的,所以s這個字串就是utf-8編碼的字串。當以gb18030編碼格式對s進行解碼的時候,將會出錯,因為「字串」
第4句**將 s 重新編碼為 gb18030 的格式,即進行 unicode -> str 的轉換。因為s本身就是 str 型別的,因此 python 會自動的先將 s 解碼為 unicode,然後再編碼成 gb18030。
而當對s進行解碼的時候,我們沒有指明解碼方式,python 就會使用 sys.defaultencoding 指明的方式來解碼。很多情況下 sys.defaultencoding 是anscii,如果 s 不是這個型別就會出錯。而我們拿上面的情況來說,我的 sys.defaultencoding 是 anscii,而 s 的編碼方式是 utf8 的(因為該py檔案的第二行指明了utf-8編碼),所以出錯了:
unicodedecodeerror: 『ascii』 codec can』t decode byte 0xe4 in position
0: ordinal not in range(128)
對於這種情況,我們有兩種方法來改正錯誤:
一是明確的指示出 s 的解碼方式
! /usr/bin/env python
-- coding: utf-8 --
s = '中文'
s.decode('utf-8').encode('gb18030') 1234
二是更改 sys.defaultencoding 為檔案的編碼方式
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
str = '中文'
str.encode('gb18030')12345678910
這裡在呼叫sys.setdefaultencoding(『utf-8』) 設定預設的解碼方式之前,執行了reload(sys),這是必須的,因為python在載入完sys之後,會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入sys,才能呼叫 sys.setdefaultencoding 這個方法。
python 編碼解碼
一種編碼想要轉成另一種編碼,需要先解碼成萬國碼 unicode,然後再從unicode轉成其他編碼。例如gbk格式想要轉成utf 8,需要先按照 gbk 的格式 decode 成 unicode,再從 unicode 格式 encode 成utf 8 python3預設使用utf 8編碼,故不用宣告...
PYTHON編碼和解碼
從第一天接觸python就對解碼和編碼的問題很困惑,最近在學習網路資料爬蟲,又遇到了一系列的解碼和編碼問題,處理中文編碼問題真的好麻煩,這次真的需要好好填坑了。詳細內容下面的文章 python字串的編碼與解碼 encode與decode 字串在python內部的表示是unicode編碼,因此,在做編...
python 檔案編碼 解碼
ascii ascii碼是西歐編碼的方式,採取7位編碼,所以是2 7 128,共可以表示128個字元,包括34個字元,如換行lf,回車cr等 其餘94位為英文本母和標點符號及運算符號等。gb2321 gb2312 是對 ascii 的中文擴充套件。相容ascii。編碼規定 編碼小於127的字元與as...