对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
。这个编码方法还要在实际的项目去实践。