python 2.x 編碼問題

最近所做的項目中涉及到很多用Python處理文檔的問題,被其中的編碼問題弄得十分頭大。個人做了一些研究,在此記錄一下。

關於各種字符編碼在此不贅述,可以參看廖雪峯:字符串與編碼

1、中文字符串報錯

在python中使用中文字符串,會出現一下錯誤:
[python] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. str = "哈哈"  
  2. print str  
  3. #運行結果報錯:SyntaxError: Non-ASCII character '\xe5'  
 出現這個問題的原因是因爲,Python 2.x的默認編碼格式是ASCII,就是說,在沒有指定Python源碼編碼格式的情況下,源碼中的所有字符都會被默認爲ASCII碼。因此,字符串“哈哈”超出了ASCII碼的表示範圍,就會出現這個問題。
解決這個問題也很簡單,在文件開頭# -*- coding: UTF-8 -*-,就能夠將該文件的編碼方式改成UTF-8編碼
[python] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. # -*- coding: UTF-8 -*-  
  2. str = "哈哈"  
  3. print str#哈哈  
這裏所說的源碼編碼方式是指對py文件的編碼,如果在命令行中運行則不會有這個問題


2、str和Unicode

字符串在Python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作爲中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。因此字符串在python內部都是unicode,而我們使用的str,其實可以說是unicode進過字符編碼後的一個字符數組。
關於字符串的編碼和解碼如下:
[python] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. # -*- coding: utf-8 -*-  
  2. str = u'哈'  
  3. print str #輸出str的unicode碼顯示哈  
  4. print repr(str) #輸出str的unicode碼:u'\u54c8'  
  5.   
  6. u = str.encode('utf8')#將str由unicode編碼成utf8  
  7. print u #輸出str的utf8碼顯示:哈  
  8. print repr(u) #輸出str的utf8編碼:'\xe5\x93\x88'  
  9.   
  10. #將str用其他編碼方式進行編碼  
  11. s = u.decode('utf8').encode('gbk')  
  12. print s #輸出str的gbk碼顯示:��  
  13. print repr(s) #輸出str的gbk編碼:'\xb9\xfe'  
以上代碼展示了一個字符串用常用編碼方式進行編碼解碼的過程

通過上述代碼我們還能發現一個問題:print str和print repr(str)的內容是不一樣的。其中repr()代表將str轉化爲一個字符串。前者輸出的是str在當前環境中所展示出來的內容,而後者則顯示了str的編碼內容。這樣看或許不明顯,我們在命令行模式下運行試試:

很顯然,print將編碼內容作了一次轉換,將其編譯成當前環境的編碼方式
然後print也不是對任何對象都有這個功能的,看下面這個例子:

顯然,在面對list對象時,print就失去了這個功能,那麼想要輸出list中具體的內容該怎麼辦呢?這裏提供一種方法:
[python] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. list = ['昨天','今天','明天']  
  2. print list #['\xe6\x98\xa8\xe5\xa4\xa9', '\xe4\xbb\x8a\xe5\xa4\xa9', '\xe6\x98\x8e\xe5\xa4\xa9']  
  3. print '[' + ','.join("'""'" + x +"'" for x in list) + ']' #['昨天','今天','明天']
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章