python中decode,encode跟unicode的關係(encode用法,decode用法)

來源:互聯網
上載者:User

轉自: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] 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.