关于golang:URL中的空格加号究竟应该使用何种方式编码

12次阅读

共计 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 函数编码

在前文中曾经总结了 GoPHPJS +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

上表中的 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…
正文完
 0