共计 2109 个字符,预计需要花费 6 分钟才能阅读完成。
来自公众号: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…