一、urlencode()

urllib库中的urlencode()方法,接受参数形式为:[(key1, value1), (key2, value2),…] 和 {‘key1’: ‘value1’, ‘key2’: ‘value2’,…}
返回的是形如key1=value1&key2=value2的字符串。

import urllib
data=[('email','北京1234@qq.com'),('password','bj12345')]  #或者为{'email':'北京1234@qq.com','password':'bj12345'}
d1=urllib.parse.urlencode(data)
print(d1)

输出结果为 email=%E5%8C%97%E4%BA%AC1234%40qq.com&password=bj12345

注意:urllib提供了unquote()这个函数,可没有urldecode()!!!

背景

我们知道,最早的字符串编码是 ASCII 编码,它仅仅对 10 个数字、26 个大小写英文字母以及一些特殊字符进行了编码。ASCII 码做多只能表示 256 个符号,每个字符只需要占用 1 个字节。
随着信息技术的发展,各国的文字都需要进行编码,于是相继出现了 GBK、GB2312、UTF-8 编码等,其中 GBK 和 GB2312 是我国制定的中文编码标准,规定英文字符母占用 1 个字节,中文字符占用 2 个字节;而 UTF-8 是国际通过的编码格式,它包含了全世界所有国家需要用到的字符,其规定英文字符占用 1 个字节,中文字符占用 3 个字节。
Python 3.x 默认采用 UTF-8 编码格式,有效地解决了中文乱码的问题。
在 Python 中,有 2 种常用的字符串类型,分别为 str 和 bytes 类型,其中 str 在内存中用 Unicode 字符表示,一个字符对应若干个字节。bytes 用来表示二进制数据。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes,这时使用 encode() 和 decode() 方法进行转换。

二、encode()

encode() 方法为字符串类型(str)提供的方法,用于将 str 类型转换成 bytes 类型,这个过程也称为“编码”。
encode() 方法的语法格式如下:
str.encode([encoding=“utf-8”][,errors=“strict”])

注意,格式中用 [] 括起来的参数为可选参数,也就是说,在使用此方法时,可以使用 [] 中的参数,也可以不使用。

该方法各个参数的含义如表 1 所示:

参数

含义

str

表示要进行转换的字符串

encoding = “utf-8”

指定进行编码时采用的字符编码,该选项默认采用 utf-8 编码。例如,如果想使用简体中文,可以设置 gb2312。当方法中只使用这一个参数时,可以省略前边的“encoding=”,直接写编码格式,例如 str.encode(“UTF-8”)

errors = “strict”

指定错误处理方式,其可选择值可以是: strict:遇到非法字符就抛出异常。 ignore:忽略非法字符。replace:用“?”替换非法字符。xmlcharrefreplace:使用 xml 的字符引用。该参数的默认值为 strict。

注意,使用 encode() 方法对原字符串进行编码,不会直接修改原字符串,如果想修改原字符串,需要重新赋值。
例:

str="北京"
str.encode()

输出结果:b'\xe5\x8c\x97\xe4\xba\xac'

三、decode()

**和 encode() 方法正好相反,decode() 方法用于将 bytes 类型的二进制数据转换为 str 类型,这个过程也称为“解码”。
decode() 方法的语法格式如下:
bytes.decode([encoding=“utf-8”][,errors=“strict”])
注意:解码时要选择和编码时一样的格式,否则会抛出异常, 如果bytes中包含无法解码的字节,decode()方法会报错,如果bytes中只有一小部分无效的字节,可以传入errors='ignore’忽略错误的字节:
例如:

str="北京"
bytes=str.encode("GBK")
print(bytes)
bytes.decode()  #默认使用 UTF-8 编码,会抛出异常

输出结果:

b'\xb1\xb1\xbe\xa9'
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb1 in position 0: invalid start byte

四、quote()

  • 传入参数类型:字符串
  • 功能:将单个字符串编码转化为%xx 的形式(url多个字符串编码用urlenocde()函数)
  • 使用:urllib.parse.quote()
    例子:
str="北京"
urllib.parse.quote(str)

输出:'%E5%8C%97%E4%BA%AC'

五、unquote()功能与quote()相反

标题在urllib 中,要进行post请求时,需传入相应的data值,对于需要传入的data 数据,需要进行urlencode编码并转化为bytes格式。postdata=urllib.parse.urlencode(data).encode(‘utf-8’)