python2.7.x的字符串编码到底什么鬼?(中文和英文的处理)

一直以来我其实一直对python的编码弄得非常晕,能正常编码,也能处理一些情况。但是始终不明白有些问题究竟为何出,原因是什么,为什么要这样用。

今天晚上正好好好研究了一番解答了自己心中的困惑。

Q:python2.7.x里面的中文表示到底是什么鬼?

A:直接来看看

In [23]: x = '好不好喝都要喝'

In [24]: x
Out[24]: '\xe5\xa5\xbd\xe4\xb8\x8d\xe5\xa5\xbd\xe5\x96\x9d\xe9\x83\xbd\xe8\xa6\x81\xe5\x96\x9d'

这个x打印值相信熟悉编码的盆友都知道,这是utf-8编码。也就是说python2.7.x 在默认情况下将中文默认转到了utf-8编码。

这里type(x)得到结果是str

Q:python2.7.x里的unicode究竟什么鬼?

A:还是通过例子来看看

In [16]: x = u'好不好喝就很好喝'

In [17]: type(x)
Out[17]: unicode

在2.7.x在中,u写在字符串前面将会将一个字符串转成unicode对象。

Q:python2.7.x中unicode可以和str相加吗?

A:还是来看例子

In [62]: z = '好不好喝'

In [63]: x = u'好不好喝都要喝'

In [64]: z+x
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-64-f964ff206363> in <module>()
----> 1 z+x UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

熟悉的报错,可见在python2.7.x中,unicode中文和utf8中文是不能相加的因为是不同类型。

Q:那么英文字符串可以相加吗?

A:可以。具体就不掩饰了大家可以自己试试。而且最终得到的结果会被转成全unicode

这两个库在对无论utf8还是unicode对象进行中文编码的时候,都会将内容转成unicode再编码。最后你拿到结果decode之后就变成了unicode对象,想要再拿到utf8对象,就需要再encode一次才可以了。

一不注意就踩坑。

上一篇:线程同步 –Mutex和Semaphore


下一篇:在Asp.Net MVC中实现上传图片并显示