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 就是把不好读的编码优化为比这种编码更好读的一种形式