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