python中unicode、utf8、gbk等編碼問題


概要:編碼轉換無疑是程序開發過程中常遇到而且很讓人頭疼的問題,一旦和數據庫交互那就更麻煩了,今天來總結一下 python 中編碼轉換的方法。

前一段時間就想寫一篇總結Python字符串的文章,但是時間較緊,而且我當時遇到的問題也不是很難,就暫擱下了,今天又被這編碼折磨一番,淚奔啊……

至於unicode、utf8等編碼原理以及區別等問題可以去百度百科查看,網上也有介紹,我想說的是直接的轉換方法——先知其然,然后再知其所以然吧。

1.普通字符串與unicode轉換

無論是什么平台什么編碼格式都能轉換為unicode格式。

以utf8編碼方式把字符串轉換為unicode:

'aaa'.decode('utf8')</pre>等同於<pre class="prettyprint">unicode('aaa', 'utf8')

把unicode字符串轉換為utf8編碼格式字符串:

'aaa'.decode('utf8')

注意:這樣寫已經表示'aaa'是一個unicode格式的字符串了,等同於

u'aaa'.decode('utf8')

如果全部是英文字符或者數字,則utf8與gbk輸出結果一致,而且帶不帶u都一樣

2.有漢字的字符串

這是中國程序員最苦逼的地方,什么亂碼之類的幾乎都是由漢字引起的,傷不起!

把普通中午字符串轉換為unicode:

'也有'.decode('gbk')

注意:此時字符串前不能加u,而且漢字編碼只能寫gbk或者gb2312等

把上面的結果再轉成gbk

print  u'\u4e5f\u6709'.encode('gbk')

當然unicode可以轉成utf8,但是要看你的終端支持什么編碼了,要不然就會亂碼,我用的WIN,所以就用gbk測試

如果不用print輸出,直接

u'\u4e5f\u6709'.encode('gbk')

或者

u'\u4e5f\u6709'.encode('utf8')

你會看到這兩個漢字在gbk和utf8編碼格式下的字符,這里不多研究了(utf8漢字編碼比gbk多一個字符)

下面把運行的結果輸出:

>>>'aaa'.decode('utf8')
u'aaa'
>>>unicode('aaa', 'utf8')
u'aaa'
>>>'aaa'.decode('utf8')
u'aaa'
>>>u'aaa'.decode('utf8')
u'aaa'
>>>'也有'.decode('gbk')
u'\u4e5f\u6709'
>>>print  u'\u4e5f\u6709'.encode('gbk')
也有
>>>u'\u4e5f\u6709'.encode('gbk')
'\xd2\xb2\xd3\xd0'
>>>u'\u4e5f\u6709'.encode('utf8')
'\xe4\xb9\x9f\xe6\x9c\x89'

說明:str()函數,有時候我們要借助它來過度轉換,比如u'%E9%95%BF%E6%98%A5%E5%B8%82',這就是我下午遇到的問 題,把urlencode轉換的編碼經過urldecode解碼,結果前面多個u,此時是utf8編碼,然后decode成unicode,出問題了:

>>> s = u'%E9%95%BF%E6%98%A5%E5%B8%82'
>>> import urllib
>>> urllib.unquote(s)
u'\xe9\x95\xbf\xe6\x98\xa5\xe5\xb8\x82'
>>> urllib.unquote(s).decode('utf8')
Traceback (most recent call last):
  File "", line 1, in 
  File "D:\Python26\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordin
al not in range(128)

特別注意:utf8編碼、gbk編碼的原型加上u然后再轉unicode是錯誤寫法,肯定轉不了,那怎樣去掉u呢?str()函數也不能直接轉,只好把u'%E9%95%BF%E6%98%A5%E5%B8%82'用str()處理去掉u,然后一切都OK了。

>>>urllib.unquote(str(s)).decode('utf8')
u'\u957f\u6625\u5e02'
>>>print urllib.unquote(str(s)).decode('utf8')
長春市


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM