python中sys.setdefaultencoding('utf-8')的作用


在python中,編碼解碼其實是不同編碼系統間的轉換,默認情況下,轉換目標是Unicode,即編碼unicode→str,解碼str→unicode,其中str指的是字節流,而str.decode是將字節流str按給定的解碼方式解碼,並轉換成utf-8形式,u.encode是將unicode類按給定的編碼方式轉換成字節流str。注意調用encode方法的是unicode對象,生成的是字節流;調用decode方法的是str對象(字節流),生成的是unicode對象。若str對象調用encode會默認先按系統默認編碼方式decode成unicode對象再encode,忽視了中間默認的decode往往導致報錯。

 

比如有如下代碼: 

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
s = '中文字符'  # 這里的 str 是 str 類型的,而不是 unicode 
s.encode('gb2312') 

這句代碼將 s 重新編碼為 gb2312 的格式,即進行 unicode -> str 的轉換。因為 s 本身就是 str 類型的,因此 
Python 會自動的先將 s 解碼為 unicode ,然后再編碼成 gb2312。因為解碼是python自動進行的,我們沒有指明解碼方式,python 就會使用 sys.defaultencoding 指明的方式來解碼。很多情況下 sys.defaultencoding為ANSCII,如果 s 不是這個類型就會出錯。
  UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 
  0: ordinal not in range(128) 

對於這種情況,我們有兩種方法來改正錯誤: 
1. 明確的指示出 s 的編碼方式 

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
s = '中文字符' 
s.decode('utf-8').encode('gb2312') 


2. 更改 sys.defaultencoding 為文件的編碼方式 

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
import sys 
reload(sys) # Python2.5 初始化后刪除了 sys.setdefaultencoding 方法,我們需要重新載入 
sys.setdefaultencoding('utf-8') 

str = '中文字符' 
str.encode('gb2312')

 

解決UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128) 

在python2中需要對str->unicode 的代碼,可以在前邊寫上

import sys
reload(sys)
sys.setdefaultencoding(‘utf8′)

把str編碼由ascii改為utf8(或 gb18030)

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM