python報錯UnicodeDecodeError:

來源:互聯網
上載者:User

標籤:view   錯誤   utf-8   rac   blog   board   div   orm   類型   

Python 裡面的編碼和解碼也就是 unicode 和 str 這兩種形式的相互轉化。編碼是 unicode -> str,相反的,解碼就 
是 str -> unicode。剩下的問題就是確定何時需要進行編碼或者解碼了.關於檔案開頭的"編碼指示",也就是 # -*- coding: -*- 這個語句。Python 預設指令檔都是 UTF-8 編碼的,當檔案中有非 UTF-8 編碼範圍內的字元的時候就要使用"編碼指示"來修正. 關於 sys.defaultencoding,這個在解碼沒有明確指明解碼方式的時候使用。比如我有如下代碼: 

[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‘) 
成功通過.

 

我總結一下為什麼要這麼寫的原因:

1. 當取回來的資料與你當前指令碼中聲明的編碼不一致時就要做編碼轉換

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

3.為什麼我的瀏覽器會傳回gb2312的編碼資料到伺服器,這應該和用戶端的系統編碼有關係

python報錯UnicodeDecodeError:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.