python中unicode、utf八、gbk等編碼問題

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

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

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

1.普通字符串與unicode轉換

不管是什麼平臺什麼編碼格式都能轉換爲unicode格式。程序員

以utf8編碼方式把字符串轉換爲unicode:數據庫

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

把unicode字符串轉換爲utf8編碼格式字符串:函數

'aaa'.decode('utf8')

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

u'aaa'.decode('utf8')

若是所有是英文字符或者數字,則utf8與gbk輸出結果一致,並且帶不帶u都同樣測試

2.有漢字的字符串

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

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

'也有'.decode('gbk')

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

把上面的結果再轉成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')
長春市
相關文章
相關標籤/搜索