URL编码的原因及场景
一般开发中,如果一个东西需要被编码,其原因有多种:由于私密信息传输需要被编码、由于传输时内容过大需要编码压缩等等;
而URL编码则是为了解决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。”
1.url路径中存在中文参数时
如下面的url路径
www.baidu.com?id=123&name=中文
对于Unicode字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如”中文”使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到”%E4%B8%AD%E6%96%87”。或是在程序中使用专门的UrlEncode编码;
正确的带中文内容路径的访问方式如下:
www.baidu.com?id=123&name=%E4%B8%AD%E6%96%87
2.url路径中带有特殊符号
某些特殊符号在url中会产生歧义
序号 | 特殊字符 | 含义 | 十六进制值 |
---|---|---|---|
1 | + | URL 中+号表示空格 | %2B |
2 | 空格 | URL中的空格可以用+号或者编码 | %20 |
3 | / | 分隔目录和子目录 | %2F |
4 | ? | 分隔实际的 URL 和参数 | %3F |
5 | % | 指定特殊字符 | %25 |
6 | # | 表示书签 | %23 |
7 | & | URL 中指定的参数间的分隔符 | %26 |
8 | = | URL 中指定参数的值 | %3D |
如下情况:
我们都知道Http协议中参数的传输是”key=value”这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如”?name1=value1&name2=value2”,这样在服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。
比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了奇异。
总结:
上述的情况就是url中特殊字符锁产生的歧义;针对上述情况,我们通常在发送http请求之前都会进行url编码,将特殊字符转换成为十六进制带百分号的形式,或者对中文字符进行url编码再进行传输。
补充:有时候在调用外部接口的时候,要注意需要传输的内容是否需要url编码,否则会出现错误。