URL中不能显示空格已经是共识,但是空格的形式在不同的标准中并不完全一致,以至于不同的语言有不同的实现。
in 清楚地表明空格应编码为 %20。
W3C 标准规定空格可以用 + 或 %20 替换。
老徐当场愣住了,空格换成了+,而+本身只能编码。 既然如此,为什么不直接编码空格呢。 当然,这只是老徐心中的疑惑。 我们无法再追溯之前的背景,也无法改变已经发生的事实。 不过,空格是用+还是20%替换,+是否需要编码,都是我们现在需要面对的问题。
Go中三种常用的URL编码方式
首先要关注的自然是Go语言本身的实现,所以我们先来了解一下Go中常用的三种URL编码方式的异同。
网址。
fmt.Println(url.QueryEscape(" +Gopher指北"))
// 输出:+%2BGopher%E6%8C%87%E5%8C%97
使用 url. 时,空格被编码为 +,+ 本身被编码为 %2B。
网址。
fmt.Println(url.PathEscape(" +Gopher指北"))
// 输出:%20+Gopher%E6%8C%87%E5%8C%97
使用网址时。 编码中,空格编码为20%,而+则不编码。
网址。
var query = url.Values{}
query.Set("hygz", " +Gopher指北")
fmt.Println(query.Encode())
// 输出:hygz=+%2BGopher%E6%8C%87%E5%8C%97
使用().方法编码时,空格被编码为+,+本身被编码为%2B。 进一步检查().的源代码显示该url。 函数仍然在内部调用。 (). 和 url 之间的区别。 区别在于前者只对查询中的键和值进行编码,而后者对 = 和 & 都进行编码。
对于我们开发者来说,应该使用这三种编码方式中的哪一种,请继续阅读,相信您可以在接下来的文章中找到答案。
不同语言的实现
由于Go中空格和+有不同的URL编码方式,那么在其他语言中也存在这种情况吗? 我们以PHP和JS为例。
PHP 中的 URL 编码
echo urlencode(' +Gopher指北');
// 输出:+%2BGopher%E6%8C%87%E5%8C%97
echo rawurlencode(" +Gopher指北");
// 输出:%20%2BGopher%E6%8C%87%E5%8C%97
PHP 和 Go 的 url。 函数具有相同的效果,但空格和 + 都被编码。
JS 中的 URL 编码
encodeURI(' +Gopher指北')
// 输出:%20+Gopher%E6%8C%87%E5%8C%97
encodeURIComponent(' +Gopher指北')
// 输出:%20%2BGopher%E6%8C%87%E5%8C%97
JS 和 Go 的 url。 函数具有相同的效果,但空格和 + 都被编码。
我们应该做什么? 推荐使用url。 函数编码
+上的Go、PHP、JS的编码操作在之前的文章中已经总结过。 下面总结了对应的解码操作是否可行的二维表。
编码/解码网址..
网址。
网址。
YY
YY
YY
YY
上表中的YY和Y含义相同。 老徐只用YY来表示那个url。 推荐用于 Go 编码,推荐用于 PHP 和 JS 编码和解码。
在实际开发过程中,肯定有需要解码的场景。 这时就需要与URL编码方进行沟通,以获得合适的解码方法。
对值进行编码
有没有一种不需要URL编码和解码的通用方式? 毫无疑问是有的! 以编码为例,编码字符集为AZ和数字2-7。 此时对值进行编码后就不需要进行url编码了。
最后,衷心希望本文能够对读者有所帮助。
本文使用的环境分别为 PHP 7.3.29、go 1.16.6 和 js.0.4606.71
参考