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')
长春市
相关文章
相关标签/搜索