来自公众号: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函数编码

在前文中曾经总结了GoPHPJS +Gopher指北的编码操作,上面总结一下其对应的解码操作是否可行的二维表。

编码/解码url.QueryUnescapeurl.PathUnescapeurldecoderawurldecodedecodeURIdecodeURIComponent
url.QueryEscapeYNYNNN
url.PathEscapeNYNYYYYY
urlencodeYNYNNN
rawurlencodeYYYYYNY
encodeURINYNYYY
encodeURIComponentYYYYYNY

上表中的YYY同含意,老许仅以YY示意在Go中举荐应用url.PathEscape进行编码,同时在PHP和JS中别离举荐应用rawurldecodedecodeURIComponent进行解码。

在理论的开发过程中,Gopher肯定会存在须要解码的场景,此时就须要和URL编码方进行沟通以失去适合的形式解码。

对值进行编码

那有没有通用的不须要URL编解码的形式呢?毫无疑问是有的!以base32编码为例,其编码字符集为A-Z和数字2-7,此时对值进行base32编码后就无需url编码了。

最初,衷心希望本文可能对各位读者有肯定的帮忙。

本文应用环境别离为PHP 7.3.29go 1.16.6js Chrome94.0.4606.71的Console

参考

  • https://www.rfc-editor.org/rf...
  • https://www.w3schools.com/tag...