工作中多次遇到Python版本的签名算法,需要用Go版本再实现一遍,这就需要牵扯到Python 2.7中的urllib中的quote,quote_plus和Go中net/url包中的url.QueryEscape的关系。
下面直接给出它们的关系:
urllib.quote_plus(str)等同于url.QueryEscape(str), urllib.quote_plus(str)和urllib.quote(str)的关系如下
rllib.quote(string[, safe])
将string中的特殊字符做转义,但是字母,数字和'_.-'不会转义,还有safe默认的'/'也不会转义, 如果safe为’‘,则'/'也会转义
比如:quote('/~connolly/') yields '/%7econnolly/'
urllib.quote_plus(string[, safe])
类似quote,但是空格被替换为+号,本身的+和/号都会转义
Python 对URL的编解码操作提供了urllib模块
urlencode 是针对字典的操作,也可以单独对一个字符串值进行编码,基于是否把空格替换为加号+的不同行为,是把空格转换为%20,还是加号+,分别有quote和quote_plus操作。
下面是我的实操记录,这是在python 2.7上的记录:
下面是Go的实操记录:
下面是对应的源码
//description: 这里验证了Go中的url.QueryEscape(str)和Python 2中的urllib.quote_plus(str)效果是一样的
//note: python 2直接在命令行中进行验证即可
//date: 2020-07-06
package main
import (
"fmt"
"net/url"
)
func main() {
str := "老王a /+ *"
fmt.Println(url.QueryEscape(str))
}
从python和Go的实操对比,可以看出,urllib.quote_plus()和url.QueryEscape() 效果是相同的。
下面是转义对应符号:
urllib.quote(str,' ')的处理结果:
空格=》%20,*=》%2A,/=》%2F,+=》%2B
urllib.quote_plus(str)的处理结果,这里第二个参数是" "或可省略:
空格=》+, *=》%2A,/=》%2F,+=》%2B
这两个函数对空格的处理是不同的。