博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
urlencode遇到中文编码问题
阅读量:7049 次
发布时间:2019-06-28

本文共 1079 字,大约阅读时间需要 3 分钟。

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'

 

转载于:https://www.cnblogs.com/senjougahara/p/6203363.html

你可能感兴趣的文章
MVC5 + EF6 简单示例
查看>>
Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
查看>>
ORACLE里锁有以下几种模式,v$locked_object,locked_mode
查看>>
【树莓派】Linux 测网速及树莓派源
查看>>
Java用户线程和守护线程
查看>>
[TypeScript] Use the never type to avoid code with dead ends using TypeScript
查看>>
Javascript 与 SPA单页Web富应用
查看>>
SpringMVC之访问静态文件
查看>>
【java设计模式】之 模板方法(Template Method)模式
查看>>
【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!...
查看>>
小米手机会不会更好
查看>>
atitit.Sealink2000国际海运信息管理系统
查看>>
android面试总结01 activity生命周期
查看>>
Java 实现策略(Strategy)模式
查看>>
Python文本爬虫实战
查看>>
leetcode:Gray Code
查看>>
IDEA+PHP+XDebug调试配置
查看>>
Jenkins
查看>>
Ubuntu离线安装Sogou拼音(附老版本安装&输入法自启动)
查看>>
springmvc结合base64存取图片到mysql
查看>>