为什么python在urlencode空格的时候会被编码成“20”⽽不
是“+”?
1、简介
空格⽬前有两种不同的编码⽅式,⼀种是在HTML4中定义的,⽽另⼀种是在RFC-3986中定义的。
1.1 HTML4编码⽅式
HTML4的application/x-www-form-urlencoded⼀节对空格的编码定义如下:
Control names and values are escaped. Space characters are replaced by +', and then rerved characters are escaped as described in [RFC1738], ction 2.2: Non-alphanumeric characters are replaced by %HH', a percent sign and two hexadecimal digits reprenting the ASCII code of the character. Line breaks are reprented as "CR LF" pairs (i.e., `%0D%0A').
The control names/values are listed in the order they appear in the document. The name is parated from the value by =' and name/value pairs are parated from each other by &'.
按照HTML4规范,空格应该被编码成加号"+",⽽如果字符本⾝就是加号"+",则应该被编码成%2B。
1.2 RFC-3986编码⽅式
RFC-3986中采⽤统⼀的编码⽅式,字符的编码格式为:%HH(H为⼗六进制字符), 并没有对空格做特殊处理。按照RFC-3986规范,空格被编码成%20,⽽加号"+"被编码成%2B。
1.3 导致的问题
pid是什么意思从上⾯可以看出,空格在两种规范下有不同的编码⽅式,也因此导致我们在开发时会遇到意想不到的错误。例如⽤户明明提交的是"你 好",写⼊数据库之后却变成了"你+好",往往这种错误让⼈摸不着头脑,其实这就是由于空格的编码错误导致的。
2. 编码建议
其实避免上⾯错误的⽅法很简单,就是在开发中我们要统⼀客户端和服务端的编码⽅式,⽽不能两者混⽤。建议客户端和服务端同时使⽤RFC-3986编码⽅式,将请求参数全部编码成%HH格式。当然为了保证正确的编码解码,统⼀的字符集也不可缺少,最好都使⽤UTF-8。
3. 编码⽰例
图书馆英语怎么读
如果客户端提交的查询字符串是"开源+中国 博客", 则HTML4采⽤UTF-8编码后结果为:
mor code
defrost
%E5%BC%80%E6%BA%90%2B%E4%B8%AD%E5%9B%BD+%E5%8D%9A%E5%AE%A2
chess怎么读注意,加号被直接编码成%2B,⽽空格则被编码成了加号"+"。
英汉
⽽RFC-3986采⽤UTF-8编码后结果为:
%E5%BC%80%E6%BA%90%2B%E4%B8%AD%E5%9B%BD%20%E5%8D%9A%E5%AE%A2
加号被直接编码成%2B,空格也被直接编码成%20。
4. Python3中的URL编码
同样的在Python3中也有html4规范的url编码⽅法quote_plus
zf是什么意思
import urllib.par
query = '/test+ test'kaixinw>公主英文
urllib.par.quote_plus(query)
>>> 'https%3A%2F%%2Ftest%2B+test'
enquery = urllib.par.quote_plus(query)
urllib.par.unquote_plus(enquery)
>>> '/test+ test'
韩语发音词典Python
Copy
RFC-3986的⽅法为quote
import urllib.par
query = '/test+ test' urllib.par.quote(query)
>>> https%3A///test%2B%20test' enquery = urllib.par.quote(query)
urllib.par.unquote(enquery)
>>> '/test+ test'