Python中的編碼與解碼

2021-07-16 18:34:26 字數 2040 閱讀 6245

之前一直對python檔案中編碼解碼糊里糊塗,今天看到一篇文章,覺得把我講的有點明白了。寫個心得吧。

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

我們在編寫python指令碼的時候,通常在#! /usr/bin/env python下面一行指定該py檔案的預設編碼格式。比如# coding=utf-8,表示該py檔案中的字串都是以utf-8格式編碼的。

而sys.defaultencoding則指明了預設的字串解碼方式。在解碼時沒有明確指明解碼方式的時候使用。

還要記住一點,字串用什麼格式編碼,就要用相同的格式解碼才能變成unicode。

#! /usr/bin/env python 

# -*- coding: utf-8 -*-

s = '中文' # 這裡的 s 是utf-8編碼的字串型別

s.encode('gb18030')

觀察上面的**,我們預計會報錯誤。因為第二行指定了該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')

二是更改 sys.defaultencoding 為檔案的編碼方式

#! /usr/bin/env python 

# -*- coding: utf-8 -*-

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

str = '中文'

str.encode('gb18030')

這裡在呼叫sys.setdefaultencoding(『utf-8』) 設定預設的解碼方式之前,執行了reload(sys),這是必須的,因為python在載入完sys之後,會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入sys,才能呼叫 sys.setdefaultencoding 這個方法。

python中的編碼與解碼

解碼 位元組 以特定的編碼方式 字元 ascll unicode字符集 utf 8 gbk gb2312 gb18030 個人感覺python2中的編碼非常的不友好,而目前python3中以 utf 8 作為系統預設編碼讓人省心不少 sys.getdefaultencoding 檢視預設編碼方式對應...

Python 編碼與解碼

字串型別是對人類友好的符號,但計算機只認識一種符號,那就是二進位制 binary 數,或者說是數字。為了用計算機可以理解的數字描述人類使用的字元,我們需要一張數字與字元對應的表。我們都知道在計算機中 1 byte 8bits,可以儲存 0 255共256個值,也就是說 1byte最多可以表示 256...

python的編碼與解碼

1.特殊情況 xe5 xae x9d xe9 x python2控制台bai輸出會有這種情況,包括以下list裡面的漢字雖du然是utf8格式的但仍然zhi不可見中文。只需要包要檢視的list轉為str並decode string escape 例子為 li 33,39 寶馬 36,39 馬 pri...