python中的编码与解码

对python的初学者来说,对字符的编码与解码是一个头痛的问题,对我也是一样。python 3严格区分了strbytes,这对Python的使用者来说一件好事。在python3中字符串是以unicode编码的,unicode是一种不会出现乱码的编码。

字符串的encode与decode

在python 3中可以说原生支持中文,例如:

1
2
3
4
5
6
7
In [50]: str = '中文'

In [51]: str
Out[51]: '中文'

In [52]: type(str)
Out[52]: str

如果把str转换成bytes,那用encode方法,相反,使用decode方法,如下:

1
2
3
4
5
In [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对象,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
In [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对象,做如下测试:

1
2
3
4
5
6
7
8
In [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对象,做如下测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
In [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。这个编码方法还要在实际的项目去实践。

文章目录
  1. 1. 字符串的encode与decode
  2. 2. base64模块
    1. 2.1. encodebytes方法与decodebytes方法
    2. 2.2. b64encode方法与b64decode方法
    3. 2.3. urlsafe_b64encode与urlsafe_b64decode方法
|