1. 程式人生 > >python中sys.setdefaultencoding('utf-8')的作用

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

error: ron load 而不是 ans Coding nbsp 我們 set

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

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