轉自:http://blog.csdn.net/flyingtimeice/article/details/4283145
初學Python,遇到很多編碼問題,記下來以免將來又忘了,很多東西不懂,都是屬於不求甚解,亂下結論,但想到拿出來可以有熱心同學指出錯誤所在,便厚起臉皮了……
首先需要瞭解Python中有兩種字串(嚴格地說,似乎不能這麼叫)。一種是普通的str對象(每個字元用8bits表示),另一種是unicode字串,它們可以相互轉換。
首先開啟pyshell,輸入一段代碼。
python 代碼
[python] view plain copy >>> a = "我" >>> b = unicode(a,"gb2312") >>> a.__class__ <type 'str'> >>> b.__class__ <type 'unicode'> >>>
看出來了吧,兩種字串。
再來 python 代碼 [python] view plain copy >>> a '/xce/xd2' >>> b u'/u6211'
變數a是兩個字元,b是一個unicode字元。
關於這兩種字串,Python文檔-->LanguageReference-->DataModel-->The standard type hierarchy-->Sequences,有一些Strings,Unicode的描述。
至於 python 代碼 [python] view plain copy >>> z = u"我" >>> #這種代碼,其實什麼都不是。 >>> z.__class__ <type 'unicode'> >>> z u'/xce/xd2'
看到了吧,這個奇怪的東西......
後來在WindowsXP、純python命令列下試過,得出的結論不同,z的結果變成了u'/u6211',這裡完全不應該在pyshell下作實驗的,看來還有很多問題尚未理解清楚
再來看看encode,decode
什麼情況用encode,什麼情況又是decode呢,剛開始總是被搞昏。其實各種本地字元集的英文名是CodedCharacter Set,要轉換為Coded,肯定是要encode了,同樣,從裡面解出來也應該叫decode……
decode就是把其他編碼轉換為unicode,等同於unicode函數;encode就是把unicode編碼的字串轉換為特定編碼。在pyshell裡繼續:
a是Str類型的,所以再用encode會報錯。用print輸出時會調用預設編碼轉換為系統編碼。 python 代碼 [python] view plain copy >>> a.decode("gb2312") u'/u6211' >>> print a.decode("gb2312") 我 >>> a.encode("gb2312") Traceback (most recent call last): File "<input>", line 1, in ? UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)
b是unicode類型,列印時需要先encode(編碼)成系統編碼 python 代碼 [python] view plain copy >>> print b.encode("gb2312") 我 >>> b.encode("gb2312") '/xce/xd2' >>> b.decode("gb2312") Traceback (most recent call last): File "<input>", line 1, in ? UnicodeEncodeError: 'ascii' codec can't encode character u'/u6211' in position 0: ordinal not in range(128)
python裡預設的encode和decode是strict模式,所以會直接拋出Error,而Java裡是預設replace模式,所以在處理servlet時經常會看到一串?????
在decode時傳入第二個參數errors為'replace'可以和Java相同,但總是沒成功,還不知道為什麼
MySQLDb串連資料庫的編碼問題
試了很久,無論在connect的時候指定charset='utf8',還是使用set_character_set(),或者執行"SET NAMES UTF8",跟蹤到character_set_name()方法返回的都是latin1...再跟代碼,似乎就跑到mysql-api裡去了,反正最後解決的辦法也很簡單,就是使用如下方式執行,而不要去拼sql語句…… python 代碼 [python]