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("25", "").replace("27", "22") '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'