編碼 解碼 python

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

一、編碼解碼是怎麼一回事?編碼

Python 裏面的編碼和解碼也就是 unicode 和 str 這兩種形式的相互轉化。.net

編碼是 unicode -> str,相反的,解碼就是 str -> unicode。code

str形式,也就是字符串形式都是以必定的編碼格式存在的,常見的編碼格式有utf-八、ASCII、gb2312等等。blog

str1.decode(‘gb2312’),表示將gb2312編碼的字符串str1解碼成unicode。utf-8

str2.encode(‘utf-8’),表示將unicode字符串str2轉換成用utf-8格式編碼的字符串。ci

不一樣編碼格式的字符串之間相互轉換編碼格式的話,都要先解碼成unicode,再編碼成其餘編碼格式的字符串。就拿上面的str1來講,將str1轉成utf-8編碼的字符串,須要這麼作:
str1.decode(‘gb2312’).encode(‘utf-8’)。unicode

二、如何在python文件中指定編碼、解碼格式呢字符串

咱們在編寫python腳本的時候,一般在#! /usr/bin/env python下面一行指定該py文件的默認編碼格式。好比# coding=utf-8,表示該py文件中的字符串都是以utf-8格式編碼的。get

而sys.defaultencoding則指明瞭默認的字符串解碼方式。在解碼時沒有明確指明解碼方式的時候使用。

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

三、編碼解碼格式要一致
! /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 這個方法。


本文來自 liuchunming033 博客 ,全文地址請點擊:https://blog.csdn.net/liuchunming033/article/details/52223612?utm_source=copy

相關文章
相關標籤/搜索