为什么要进行URL编码?

为什么要进行URL编码

大家都知道Http协议中参数的传输是”key=value”这种键值对形式,如果要传多个参数就需要用“&”符号对键值对进行分割。如”?name1=value1&name2=value2”,这样服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。
针对“name1=value1&name2=value2”,客户端到服务端的解析过程如下:
上述字符串在计算机中用ASCII码表示为:

1
2
3
4
5
6
7
8
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532。
6E616D6531:name1
3D:=
76616C756531:value1
26:&
6E616D6532:name2
3D:=
76616C756532:value2

服务端在接收到该数据后就会遍历该字节流,首先一个字节一个字节的吃,当吃到3D这字节后,服务端就知道前面吃的字节表示一个key,再向后吃,如果遇到26,说明从刚才吃的3D到26子节之间的是上一个key的value,以此类推就可以解析出客户端传过来的参数。

问题:如果参数值中就包含=或&这种特殊字符的时候该怎么办?

比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了歧义。

解决方案

解决的办法就是对参数进行URL编码。URL编码只是简单的在特殊字符的各个字节前加上%,例如,我们对上述会产生奇异的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。原文地址:http://www.cnblogs.com/jerrysion/p/5522673.html

URL中“+”的处理

客户端请求:http://www.xxx.com/index.php?username=a+b
服务器端,username参数接收到的内容实际为“a b”,即username=“a b”,注意中间有个空格,这是因为“+”是URL的保留字符,代表“空格”。如果想要传输正常的“+”,而不被转义为“空格”,需要对“+”进行URL编码:http://www.xxx.com/index.php?username=a%2Bb。

如果要想正确的让服务器端接收到数据中的“+”,需要在URL中对“+”进行编码,%2B。
如果要想正确的让服务器端接收到数据中的“空格”,可以在URL中直接使用“+”,或者是使用“空格”的URL编码,%20,或者直接在URL中输入空格,因为浏览器会默认将空格进行URL编码之后再发送给服务器。

提醒:如果想将特殊字符带入到数据库中执行,建议将输入得到语句全部进行URL编码之后发送。