如何使用编码的 unicode 字符对作为 python 字典的值进行 urlencode

how to urlencode a value that is a python dictionary with encoded unicode characters

我正在尝试在 python 2.7 中发出一个 url 编码的 Web 请求,我想在其中发送 python 字典的列表,这些字典将在服务器上解码为JSON 个对象的列表。 本质上我在做:

>>>urllib.urlencode({"param":"val", "items":[item1, item2] }, True)

其中 item1 可以类似于 { "a": u"š".encode("utf8") }(示例已简化)

问题的出现是因为 unicode 字符。

如果 item1 是单独编码的,你会得到一些有意义的东西:

>>>urllib.urlencode(item1)
'a=%C5%A1'

但是,如果我调用 urllib.urlencode({"test": item1}),我会变得一团糟:

'test=%7B%27a%27%3A+%27%5Cxc5%5Cxa1%27%7D'

在这种情况下,unicode 字符不再编码为 %C5%A1,而是编码为更长的序列,然后在服务器端被错误解码。

有人建议在调用 urlencode 之前如何正确转换复杂的字典值(即 item1)以避免此问题吗?

您需要以某种方式解码在重新编码之前编码的任何内容这是一种方法:

dictionary = {"test": item1}
urllib.urlencode(dict([(k, decode_operation(v)) for k, v in dictionary.iteritems()]))

我通过首先为项目列表中的每个项目调用 json.dumps(item) 然后调用 urllib.urlencode.

解决了我的问题

简而言之:

>>>urllib.urlencode({"param":"val", "items":[json.dumps(item) for item in items] }, True)

这解决了问题,因为 unicode 字符随后使用 \uXXXX 进行编码,可以在服务器端使用 json 解析器正确解码。