URL编码

来源:互联网 发布:access 找不到数据库 编辑:程序博客网 时间:2024/06/10 23:24
1、为什么url需要编码?
我们知道Http协议中参数的传输都是"key=value"这种键值对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。如"?name1=value1&name2=value2",这样在服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。
现在如果我们传输的参数值中就包含=或&这种特殊字符的时候该怎么办? 比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了歧义。

如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码 
   URL编码只是简单的在特殊字符的各个字节前加上%,例如,我们对上述会产生歧义的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。

Url编码通常也被称为百分号编码,是因为它的编码方式非常简单,使用%百分号加上两位的字符(0123456789ABCDEF)代表一个字节的十六进制形式。Url编码默认使用的字符集是US-ASCII。对于非ASCII字符,需要使用ASCII字符集的超集进行编码得到相应的字节,然后对每个字节执行百分号编码。对于Unicode字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到"%E4%B8%AD%E6%96%87"。

2、Javascript中的 encodeURI和encodeURIComponent的区别

encodeURI和encodeURIComponent都使用UTF-8对非ASCII字符进行编码,然后再进行百分号编码。
encodeURI操纵的对象是一个完整的的URI,这些字符在URI中本来就有特殊用途,因此这些保留字符不会被encodeURI编码,否则意义就变了。
这就意味着如果参数中有保留字符,那么没法进行编码,可能会出现错误。
encodeURIComponent被用作对URI的一个组件进行编码

3、表单提交中的编码

当Html的表单被提交时,每个表单域都会被Url编码之后才在被发送。
对于非ASCII字符,使用的编码字符集取决于当前文档使用的字符集。例如我们在Html头部加上
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
  这样浏览器就会使用gb2312去渲染此文档(注意,当HTML文档中没有设置此meta标签,则浏览器会根据当前用户喜好去自动选择字符集,用户也可以强制当前网站使用某个指定的字符集)。当提交表单时,Url编码使用的字符集就是gb2312。

4、页面的编码格式
页面保存时的字符集 与 文件声明的字符集 要保持一致,比如在IDE里面编写HTML的文件,保存的时候选择UTF-8格式,此时在HTML里面的meta标签里面也应该设置charset=utf-8,否则会出现问题

5、Tomcat的URIEncoding配置项
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

默认情况下,Tomcat解析URI编码使用的是ISO8859-1的编码格式,这个地方也需要设置为UTF-8,否则应用程序里面获取的参数也会出现乱码

原创粉丝点击