来自公众号:Gopher指北
URL中不能显示地蕴含空格这曾经是一个共识,而空格以何种模式存在,在不同的规范中又不完全一致,以致于不同的语言也有了不同的实现。
rfc2396
中明确示意空格应该被编码为%20
。
而W3C的规范中却又说空格能够被替换为+
或者%20
。
老许当场懵逼,空格被替换为+
,那+
自身只能被编码。既然如此,为什么不间接对空格进行编码呢。当然这只是老许心中的纳闷,以前的背景咱们曾经无奈追溯,已成的事实咱们也无奈扭转。但,空格到底是被替换为+
还是20%
,+
是否须要被编码都是当初的咱们须要直面的问题。
Go罕用的三种URL编码方式
作为Gopher最先关注的天然是Go语言自身的实现,因而咱们首先理解一下Go中罕用的三种URL编码方式的异同。
url.QueryEscape
fmt.Println(url.QueryEscape(" +Gopher指北"))// 输入:+%2BGopher%E6%8C%87%E5%8C%97
应用url.QueryEscape
编码时,空格被编码为+
,而+
自身被编码为%2B
。
url.PathEscape
fmt.Println(url.PathEscape(" +Gopher指北"))// 输入:%20+Gopher%E6%8C%87%E5%8C%97
应用url.PathEscape
编码时,空格被编码为20%
, 而+
则未被编码。
url.Values
var query = url.Values{}query.Set("hygz", " +Gopher指北")fmt.Println(query.Encode())// 输入:hygz=+%2BGopher%E6%8C%87%E5%8C%97
应用(Values).Encode
办法编码时,空格被编码为+
,而+
自身被编码为%2B
,进一步查看(Values).Encode
办法的源码知其外部仍旧调用url.QueryEscape
函数。而(Values).Encode
办法和url.QueryEscape
的区别在于前者仅编码query中的key和value,后者会对=
、&
均进行编码。
对咱们开发者而言,这三种编码方式到底应该应用哪一种,请持续浏览后文置信你能够在前面的文章中找到答案。
不同语言中的实现
既然空格和+
在Go中的URL编码方式有不同的实现,那在其余语言中是否也存在这样的状况呢,上面以PHP和JS为例。
PHP中的URL编码
urlencode
echo urlencode(' +Gopher指北');// 输入:+%2BGopher%E6%8C%87%E5%8C%97
rawurlencode
echo rawurlencode(" +Gopher指北");// 输入:%20%2BGopher%E6%8C%87%E5%8C%97
PHP的urlencode
和Go的url.QueryEscape
函数成果统一,而rawurlencode
则将空格和+
均进行编码。
JS中的URL编码
encodeURI
encodeURI(' +Gopher指北')// 输入:%20+Gopher%E6%8C%87%E5%8C%97
encodeURIComponent
encodeURIComponent(' +Gopher指北')// 输入:%20%2BGopher%E6%8C%87%E5%8C%97
JS的encodeURI
和Go的url.PathEscape
函数成果统一,而encodeURIComponent
则将空格和+
均进行编码。
咱们应该怎么做
更举荐应用url.PathEscape函数编码
在前文中曾经总结了Go
、PHP
和JS
对 +Gopher指北
的编码操作,上面总结一下其对应的解码操作是否可行的二维表。
编码/解码 | url.QueryUnescape | url.PathUnescape | urldecode | rawurldecode | decodeURI | decodeURIComponent |
---|---|---|---|---|---|---|
url.QueryEscape | Y | N | Y | N | N | N |
url.PathEscape | N | Y | N | YY | Y | YY |
urlencode | Y | N | Y | N | N | N |
rawurlencode | Y | YY | Y | Y | N | Y |
encodeURI | N | Y | N | Y | Y | Y |
encodeURIComponent | Y | YY | Y | Y | N | Y |
上表中的YY
和Y
同含意,老许仅以YY
示意在Go中举荐应用url.PathEscape
进行编码,同时在PHP和JS中别离举荐应用rawurldecode
和decodeURIComponent
进行解码。
在理论的开发过程中,Gopher肯定会存在须要解码的场景,此时就须要和URL编码方进行沟通以失去适合的形式解码。
对值进行编码
那有没有通用的不须要URL编解码的形式呢?毫无疑问是有的!以base32
编码为例,其编码字符集为A-Z和数字2-7
,此时对值进行base32编码后就无需url编码了。
最初,衷心希望本文可能对各位读者有肯定的帮忙。
本文应用环境别离为PHP 7.3.29
、go 1.16.6
和js Chrome94.0.4606.71的Console
参考
- https://www.rfc-editor.org/rf...
- https://www.w3schools.com/tag...