聊聊 Python 家常事,编码问题天天有。
1068 年老美发布了 ASCII 标准,这个标准规定了 0-127 这 128 个数字代表的字母或控制字符。但是 128 个数字怎么能囊括天下字符。于是 Unicode 出现了 。它用了 16 个比特来代替 ASCII 的 7 个比特。可以代表最多 216=65536 个字符。
坑爹的 Python2,默认用的就是 ASCII 编码。
我们来简单测试一下
>>> s = u'Was ever feather so lightly blown to and fro as this multitude?'
>>> s.find('Was\x9f')
Traceback (most recent call last):
...
UnicodeDecodeError: 'ascii' codec can't decode byte 0x9f in position 3:
ordinal not in range(128)
出现了,坑爹的UnicodeDecodeError
错误
换种写法,前面加个 u,说明查找的是 unicode,然后就不会出问题了。
>>> s.find(u'Was\x9f')
-1
默认是 ASCII 解码的,我们可以写个函数来制定下解码方法
import six
def u(s):
if six.PY2:
return s.decode('utf-8') if type(s) is str else s
return s
凡是在处理字符串之前先用 u(s)
处理下,就不会出问题了
比如
def foo(s):
print u(s).encode('utf-8')