通用技术 Python2.7 的编码问题

codeskyblue · 2017年08月30日 · 793 次阅读

聊聊 Python 家常事,编码问题天天有。

History

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')

完毕

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册