聊聊python的unicode 问题

Python的中文字符处理

都说python对中文不太友好。

我们看看下面两个例子:
测试环境是ubuntu;
python版本为2.7

》a = '呵呵'
》a 
》'\xe5\x91\xb5\xe5\x91\xb5'
》print a
》呵呵

为什么print 和 直接输入变量回车显示的东西不一样呢?
\xe5\x91\xb5\xe5\x91\xb5这些是什么东西啊。一定很奇怪。其实bytes字符编码,是8进制的东西。

首先’呵呵‘ 字符串赋值给a。然而python 内部是以’\xe5\x91\xb5\xe5\x91\xb5’保存的,这应该是utf-8(因为ubuntu默认为uhf-8)的unicode 对应的8进制字符编码

我们再看看:

》a=u’呵呵’ #带上u表示将这字符串转为unicode
》a
》u’\u5475\u5475’
》print a
》呵呵

我们发现print真是厉害,不管是字符串 还是 unicode 它都能显示为中文的字符。而回车显示的u’\u5475\u5475’是什么呢?这是’呵呵’对应的uncode编码

我们知道unicode可以 通过encode 编码来转为str

》a.encode('utf-8')
》'\xe5\x91\xb5\xe5\x91\xb5'
》print a.encode('utf-8')
》呵呵

我们看到encode后显示的str和我们最开始显示的’\xe5\x91\xb5\xe5\x91\xb5’一样。这说吗中文的字符串在python里就是用\x这种字符串编码保存的

print 可以把这种编码自动地解码并且显示为对应的中文字符

另外,有些时候会碰到这种情况,请看下面:

》a=u'呵呵'
》l=[a]
》s=str(l)
》s
》"[u'\\u5475\\u5475']"

哟,怎么多了个\
有时候,python会以这种编码保存,这不知道是什么编码,多了一个斜杠的
遇到这种情况我们可以用如下办法

》s.decode('unicode_escape')
》s
》u"[u'\u5475\u5475']"

这样就可以把它变回来了。此外我们可以print s一下看看会出现什么呢?

》print s
》[u'\u5475\u5475']

哈,其实print 就是把不好读的编码优化为比这种编码更好读的一种形式

总结:print就是让显示出来的东西尽量友好。没那么多乱七八糟