代碼上面應該沒有什麼問題,Python使用的是版本2.7,但是在運行的時候出現了異常錯誤UnicodeEncodeError: 本來以為數據讀取錯誤,我特將fp.write改成print,結果數據全部讀取並顯示在命令控制臺上了,證明代碼是沒有問題的,仔細看了下異常信息,貌似是因為編碼問題:Unico ...
代碼上面應該沒有什麼問題,Python使用的是版本2.7,但是在運行的時候出現了異常錯誤UnicodeEncodeError:
本來以為數據讀取錯誤,我特將fp.write改成print,結果數據全部讀取並顯示在命令控制臺上了,證明代碼是沒有問題的,仔細看了下異常信息,貌似是因為編碼問題:Unicode編碼與ASCII編碼的不相容,其實這個Python腳本文件是由utf-8編碼的,同時SQlite3資料庫存取的也是UTF-8格式,Python預設環境編碼通過下麵的方法可以獲取:
基本上是ascii編碼方式,由此Python自然調用ascii編碼解碼程式去處理字元流,當字元流不屬於ascii範圍內,就會拋出異常(ordinal not in range(128))。
解決的方案很簡單,修改預設的編碼模式,很多朋友會想到setdefaultencoding,是的,我們可以通過sys.setdefaultencoding(‘utf-8’)來將當前的字元處理模式修改為utf-8編碼模式,值得註意的是,如果單純這麼調用的話,Python會拋出一個AttributeError異常:
竟然說sys沒有setdefaultencoding的方法,其實sys是有這個方法的,但是要請出她老人家需要調用一次reload(sys),很奇怪,是麽?如果有誰知道原因的話,還望不吝賜教。
好了,通過上面短短的三行,我們算是很好的解決了這個問題了,同樣的方式也可以應用到UnicodeDecodeError上。當然這個技巧來自於網路,我還找到其他特別的辦法,但是感覺還是這個比較靠譜,有童鞋說:我們將Python 2.x系列升級到Python 3.x系列就可以了,小小的問題犯不著升級吧,畢竟2到3還是要有個過渡的。