为什么对 formdata 进行 urlencode 然后用 utf-8 再次编码,这里的逻辑是什么?

why urlencode a formdata then encode it again with utf-8, what's logic here?

我正在阅读教程,发现这段代码真的很混乱。

from urllib import request, parse

print('Login to somesite.com...') 
email = input('Email: ') 
passwd = input('Password: ') 
login_data = parse.urlencode([
    ('username', email),
    ('password', passwd),
    ('entry', 'mweibo'),
    ('client_id', ''),
    ('savestate', '1'),
    ('ec', ''),
    ('pagerefer', 'a referer') ])

req = request.Request('somesite.com') 
req.add_header('Origin', 'a origin') 
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25') 
req.add_header('Referer', 'a referer')

with request.urlopen(req, data=login_data.encode('utf-8')) as f:
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', f.read().decode('utf-8'))

urlencode 在这里做什么,login_data.encode('utf-8')) 接下来做什么?

虽然它们具有相同的名称,但它们执行不同类型的操作:

  • URL 编码用于调整一些数据作为 URL 的一部分发送。 URL对字符的种类有一定的限制,不能包含空格或@等特殊字符,因此必须转换以免混淆(例如空格变成%20)。在 parse 中,它基本上采用元组列表 (left, right) 并创建一个包含 name=value 列表且由 & 分隔的字符串。为了澄清,这里有一个例子

代码:

parse.urlencode([
    (name1,value1), (name2, value2)
])

结果:

name1=value1&name2=value2
  • UTF-8编码用于将字符映射到一个字节序列。 Char 必须表示为字节(与其他所有内容一样)并且存在各种映射。 UTF-8 是最常用的编码之一,因为它能够映射各种字符,同时保持最常用的字符简短。