对python的初学者来说,对字符的编码与解码是一个头痛的问题,对我也是一样。python 3严格区分了str与bytes,这对Python的使用者来说一件好事。在python3中字符串是以unicode编码的,unicode是一种不会出现乱码的编码。
字符串的encode与decode
在python 3中可以说原生支持中文,例如:
1 | In [50]: str = '中文' |
如果把str转换成bytes,那用encode方法,相反,使用decode方法,如下:
1 | In [53]: str.encode('utf-8') |
所以在python 3中进行编码的转换记住以下要点即可:
str转换成bytes,使用encode方法,bytes转换为str,使用decode方法
base64模块
在python标准库中有一个base64的标准库,这个模块提供的更加丰富的功能实现对数据的编码与解码,官方文档请看这里,这里记录几个常用的方法 。
encodebytes方法与decodebytes方法
encodebytes方法表示对bytes对象进行编码操作,decodebytes方法的功能刚好相反,是一个解码的操作,两个方法都是返回一个bytes对象,如下:
1 | In [71]: import base64 |
b64encode方法与b64decode方法
这两个方法也是对bytest对象进行编码与解码操作,也是返回一个bytes对象,做如下测试:
1 | In [83]: s |
从编码的输出结果可看出与采用encodebytes方法编码出的结果几乎是一样的,只是最后少了\n这两个字符。
urlsafe_b64encode与urlsafe_b64decode方法
这两个方法也是对bytest对象进行编码和解码操作,同样返回一个bytes对象,做如下测试:
1 | In [88]: s |
发现与采用b64encode方法编码出的结果是一样的。
上边只是base64这个模块的一少数几个方法,更多的方法说明去看官网吧。那为什么base64这个模块提供的上面几个编码方法编码后的内容都是几乎一样的,那为什么会有一同的实现?现在我也不知道这内部的原理和原因。urlsafe_b64encode方法有urlsafe这个关键字,猜想是对url这样类似的bytes对象做编码时应该使用这个方法吧,比如http://zhaochj.github.io或是一个系统路径/etc/test.conf。这个编码方法还要在实际的项目去实践。