urlencode遇到中文编码问题

时间:2023-03-09 07:07:56
urlencode遇到中文编码问题

urlencode并不会改变输入的编码格式, 默认会将中文输出为 gbk 编码, 类似的, quote 会对中文进行 gbk 编码

不过, 当遇到嵌套多层的字典时, 问题就来了, 中文会被 utf8 编码, 原因是, 除去最外层的里面整个字典会被认为是一个字符串, 当然, 没有错.

问题是, 内层字典中的中文键值会被转换成utf8格式.

>>> from urllib import urlencode

>>> urlencode({"n":"你还"})
'n=%E4%BD%A0%E8%BF%98'
>>>
输出正常, 岁月静好 >>> urlencode({"a":{"n":"你还"}})
'a=%7B%27n%27%3A+%27%5Cxe4%5Cxbd%5Cxa0%5Cxe8%5Cxbf%5Cx98%27%7D'
问题来了, 某些接口需要 gbk 编码, 怎么破?

现在, 假设有个很奇葩的接口, 它需要所有的引号都是双引号%22, urlencode 默认输出单引号%27, 所有的中文都是gbk.

有个说法, 你可以先 quote 再 urlencode, 但是, 有个潜在的坑是, quote 生成的 % 会被urlencode 翻译成 %25

>>> from urllib import quote
>>> quote("你还")
'%E4%BD%A0%E8%BF%98'
正常的输出, 现世安稳 >>> urlencode({"a":{"n":quote("你还")}})
'a=%7B%27n%27%3A+%27%25E4%25BD%25A0%25E8%25BF%2598%27%7D'
迷之%25, 其实就是 %

比较简单粗暴的做法

>>> urlencode({"a":{"n":quote("你还")}}).replace("", "").replace("", "")
'a=%7B%22n%22%3A%22%E4%BD%A0%E8%BF%98%22%7D'

Python 3 就不会有这个问题, 除了还是把双引号搞成了单引号

>>> from urllib.parse import urlencode
>>> urlencode({"a":{"n":"你还"}})
'a=%7B%27n%27%3A+%27%E4%BD%A0%E8%BF%98%27%7D'