文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-02 20:18

关注

本文转载自微信公众号「Gopher指北」,作者新世界杂货铺。转载本文请联系Gopher指北公众号。

URL中不能显示地包含空格这已经是一个共识,而空格以何种形式存在,在不同的标准中又不完全一致,以致于不同的语言也有了不同的实现。

rfc2396中明确表示空格应该被编码为%20。

而W3C的标准中却又说空格可以被替换为+或者%20。

老许当场懵逼,空格被替换为+,那+本身只能被编码。既然如此,为什么不直接对空格进行编码呢。当然这只是老许心中的疑惑,以前的背景我们已经无法追溯,已成的事实我们也无法改变。但,空格到底是被替换为+还是20%,+是否需要被编码都是现在的我们需要直面的问题。

Go常用的三种URL编码方式

作为Gopher最先关注的自然是Go语言本身的实现,因此我们首先了解一下Go中常用的三种URL编码方式的异同。

url.QueryEscape

  1. fmt.Println(url.QueryEscape(" +Gopher指北")) 
  2. // 输出:+%2BGopher%E6%8C%87%E5%8C%97 

使用url.QueryEscape编码时,空格被编码为+,而+本身被编码为%2B。

url.PathEscape

  1. fmt.Println(url.PathEscape(" +Gopher指北")) 
  2. // 输出:%20+Gopher%E6%8C%87%E5%8C%97 

使用url.PathEscape编码时,空格被编码为20%, 而+则未被编码。

url.Values

  1. var query = url.Values{} 
  2. query.Set("hygz"" +Gopher指北"
  3. fmt.Println(query.Encode()) 
  4. // 输出: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

  1. echo urlencode(' +Gopher指北'); 
  2. // 输出:+%2BGopher%E6%8C%87%E5%8C%97 

rawurlencode

  1. echo rawurlencode(" +Gopher指北"); 
  2. // 输出:%20%2BGopher%E6%8C%87%E5%8C%97 

PHP的urlencode和Go的url.QueryEscape函数效果一致,而rawurlencode则将空格和+均进行编码。

JS中的URL编码

encodeURI

  1. encodeURI(' +Gopher指北'
  2. // 输出:%20+Gopher%E6%8C%87%E5%8C%97 

encodeURIComponent

  1. encodeURIComponent(' +Gopher指北'
  2. // 输出:%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/rfc/rfc2396.txt

 

https://www.w3schools.com/tags/ref_urlencode.ASP

 

来源: Gopher指北内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯