工作当中经常遇到通过URL传递参数(常见的如GET请求)时出现参数乱码,或者URL中的参数传递到后端多了空格等字符,或者URL传递的参数被莫名其妙截断,或者http接口需要的数字签名参数一直验签失败等问题,经验丰富的程序员第一反应可能都是需要URL编解码,可为什么需要,什么时候需要,你是否一直都处于懵逼的状态?「码了个啥」继续发扬「死坑自个儿,分享大家」的程序员精神,与大家一起梳理一下关于URL编解码的问题。
为什么要URL编码
URL,即统一资源定位符,是可以从互联网上得到的资源的位置和访问方法的一种简洁表示,是互联网上标准资源的地址,它使用ASCⅡ字符集的一部分来表示互联网的地址,百度百科如是说。这里重点就是ASCⅡ字符集,意味着URL中如果有非ASCⅡ字符,如汉字等就必须要经过编码转化为ASCⅡ字符集字符。为什么说是一部分ASCⅡ字符集?因为URL需要过滤具有某些特殊含义的字符,网络标准RFC 1738做了硬性规定:
"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."
“...只有字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。”
实际上,浏览器等很多http客户端,在我们输入URL访问某一资源时,会对URL自动进行编码,我们Java开发最常用的spring mvc也会对URL进行自动解码,进行资源映射和参数绑定,很多时候并不需要程序员关心。
我们实际开发中遇到的需要URL编解码的问题,往往是URL中的参数需要编解码,比如URL参数乱码,或者URL中的参数莫名其妙多了空格等其它字符,或者URL传递的参数被莫名其妙截断,又或者http接口需要的数字签名参数一直验签失败等问题。
如何编码
URL编码通常也被称为百分号编码(percent-encoding),使用%加上两位十六进制字符。URL编码要做的,就是将每一个非安全的ASCII字符都被替换为“%xx”格式,对于非ASCII字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过URL编码后得到"%E4%B8%AD%E6%96%87"。
URL编码表:
实际上,浏览器等很多HTTP客户端会对URL自动进行编码,比如我们要访问参数包含中文和URL参数分割符'&'的URL地址:
Microsoft Edge 浏览器看上去:
谷歌浏览器看上去:
可以看出参数aaa都被'&'符截断为两个参数,URL自动编解码并不能解决比如回掉地址拼接,分享链接拼接用户标识,或者URL拼接埋点参数等URL拼接所遇到的参数传递的问题,这个时候就需要我们手动对URL的参数部分进行编解码。
前端JavaScript做编解码
JavaScript URL编解码函数:
encodeURI()与decodeURI(),它适用于对整个URL进行编码,因此除了常见的符号以外,对其他一些在URL中有特殊含义的符号"; / ? : @ & = + $ , #"不进行编码。
JavaScript URL编解码函数:
encodeURIComponent()与 decodeURIComponent(),它与encodeURI()和decodeURI()的区别是,它适用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中会被编码。
下面的例子很容易看出两组函数的区别:
因此我们可以得出结论:
对个别URL组成部分,如参数编码用encodeURIComponent函数。
后端Java做编解码
java.net.URLEncoder#encode(java.lang.String, java.lang.String)与
java.net.URLDecoder#decode(java.lang.String, java.lang.String)
可以很容易看出,JavaURLEncoder#encode方法的功能与JavaScript 的encodeURIComponent函数相同。
以上,我们可以知道,像回掉地址拼接,分享链接拼接用户标识,或者URL拼接埋点参数等通过URL传递参数的开发需求,往往会遇到URL编解码参数传递的问题,比如URL参数乱码,或者URL中的参数莫名其妙多了空格等其它字符,或者URL传递的参数被截断,这个时候就需要我们手动对URL的参数部分进行编解码,再拼接到URL上,然后交由浏览器等HTTP客户端自动对URL做二次编解码,就能避免URL参数传递所遇到的问题。
新化月报网报料热线:886 2395@qq.com
最近更新
- 着力打造传播赣州红色文化数字平台2022-01-16
- 苏州共享单车停放新规来了2022-01-16
- 海南省总工会与邮储银行海南省分行举行金融普惠服务战略合作签约仪式2022-01-16
- 战“疫”有我!硬刚奥密克戎,天津体育人在行动2022-01-16
- 春节期间,平潭有哪些易堵、危险路段?快来看看……2022-01-16
- 全省唯一!长治市交通运输局获交通运输部表扬2022-01-16
- 立体交通激发发展新动能——长沙2021年度经济发展报告(四)2022-01-16
- 长沙部署八大方面27项任务发展高品质交通运输服务2022-01-16
- 全球首个“基因脸谱”App在长发布2022-01-16
- 共谋长沙体育产业新发展 长沙市体育产业协会2021年年会召开2022-01-16
- 阿图什市公安局开展爱国卫生运动集中志愿者服务活动2022-01-16
- 三张新照 展现“矿区”变“景区”2022-01-16
- 广西壮族自治区人民代表大会常务委员会关于接受黄世勇辞去自治区副主席职务请求的决定2022-01-16
- 讲解知识 宣传反诈 让老年人守住“钱袋子”2022-01-16
- 「中央媒体看甘肃」凉州西瓜畅销四方2022-01-16
- 高台县新坝镇中心卫生院红崖子分院多措并举积极推动医共体建设工作2022-01-16
- 福田人:先核酸再买药!这39类药品需到定点药房购买2022-01-16
- 马术运动拓开乡镇农牧民致富路2022-01-16
- 城东湖街道向先进社区“看齐”2022-01-16
- 在巍巍长城间守望(青春日记)2022-01-16
- 注意!福州市中心这条路出行有变2022-01-16
- 市政协委员建议推动出台《重庆市民营企业发展促进条例》高质量集聚发展“专精特新”中小企业2022-01-15
- 喷洒消毒剂2.9吨!鹤壁鹤山区对城区公共场所集中消杀2022-01-15
- 大庆两会看检察 | 漫看大庆检察“高光”时刻(一)2022-01-15
- @所有焦作人 坐火车不用再带身份证了2022-01-15
- 从警前VS从警后,一同追忆那段“芳华”!2022-01-15
- 速看!福州这个路段出行有变2022-01-15
- 【长三角日报】绍兴原市委书记马卫光,任杭州市政协党组书记2022-01-15
- 西安市新城区发布关于在外人员返乡有关事项的通告2022-01-15
- 大幅提速!长春中院首次适用二审民事案件独任制审判2022-01-15