推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

URL中的空格、加号究竟应该使用何种方式编码

   2023-08-25 网络整理佚名2350
核心提示:既然如此,为什么不直接对空格进行编码呢。编码时,空格被编码为+,而+本身被编码为%2B。方法编码时,空格被编码为+,而+本身被编码为%2B,进一步查看().的区别在于前者仅编码query中的key和value,后者会对=、&均进行编码。既然空格和+在Go中的URL编码方式有不同的实现,那在其他语言中是否也存在这样的情况呢,下面以PHP和JS为例。函数效果一致,而则将空格和+均进行编码。函数效果一致,而则将空格和+均进行编码。

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

参考

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON