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("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'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM