python報錯UnicodeDecodeError:

Python 裏面的編碼和解碼也就是 unicode 和 str 這兩種形式的相互轉化。編碼是 unicode -> str,相反的,解碼就 
是 str -> unicode。剩下的問題就是肯定什麼時候須要進行編碼或者解碼了.關於文件開頭的"編碼指示",也就是 # -*- coding: -*- 這個語句。Python 默認腳本文件都是 UTF-8 編碼的,當文件中有非 UTF-8 編碼範圍內的字符的時候就要使用"編碼指示"來修正. 關於 sys.defaultencoding,這個在解碼沒有明確指明解碼方式的時候使用。好比我有以下代碼: 
python

[python]  view plain  copy
 
  1. #! /usr/bin/env python   
  2. # -*- coding: utf-8 -*-   
  3. s = '中文'  # 注意這裏的 str 是 str 類型的,而不是 unicode   
  4. s.encode('gb18030')   


這句代碼將 s 從新編碼爲 gb18030 的格式,即進行 unicode -> str 的轉換。由於 s 自己就是 str 類型的,所以 
Python 會自動的先將 s 解碼爲 unicode ,而後再編碼成 gb18030。由於解碼是python自動進行的,咱們沒有指明解碼方式,python 就會使用 sys.defaultencoding 指明的方式來解碼。不少狀況下 sys.defaultencoding 是 
ANSCII,若是 s 不是這個類型就會出錯。拿上面的狀況來講,個人 sys.defaultencoding 是 anscii,而 s 的編碼方式和文件的編碼方式一致,是 utf8 的,因此出錯了: 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 
0: ordinal not in range(128) 
對於這種狀況,咱們有兩種方法來改正錯誤: 
一是明確的指示出 s 的編碼方式 

瀏覽器

[python]  view plain  copy
 
  1. #! /usr/bin/env python   
  2. # -*- coding: utf-8 -*-   
  3.   
  4. s = '中文'   
  5. s.decode('utf-8').encode('gb18030')   


二是更改 sys.defaultencoding 爲文件的編碼方式 

服務器

[python]  view plain  copy
 
  1. </pre><p><pre name="code" class="python">#! /usr/bin/env python   
  2. # -*- coding: utf-8 -*-   
  3. import sys   
  4. reload(sys) # Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,咱們須要從新載入   
  5. sys.setdefaultencoding('utf-8')   
  6.   
  7. str = '中文'   
  8. str.encode('gb18030')  


 

看完以後,改爲這樣編碼

print "<p>addr:", form["addr"].value.decode('gb2312').encode('utf-8') 
成功經過.spa

 

我總結一下爲何要這麼寫的緣由:.net

1. 當取回來的數據與你當前腳本中聲明的編碼不一致時就要作編碼轉換code

2.在編碼轉換時首先要將該數據以自身編碼的格式換成unicode碼,再將這個unicode按utf8編碼orm

3.爲何個人瀏覽器會傳回gb2312的編碼數據到服務器,這應該和客戶端的系統編碼有關係blog

相關文章
相關標籤/搜索