URL编码来源及详解

2018-01-29 13:12:59来源:http://570109268.iteye.com作者:青春..荒唐人点击

分享

URL 编码会将字符转换为可通过因特网传输的格式

 

【URL - 统一资源定位器】

Web 浏览器通过 URL 从 web 服务器请求页面。

URL 是网页的地址,比如: http://www.runoob.com

 

【URL 编码】

在URL编码的过程中,经常看到这样的东西,如%2B,%25,这是哪种编码呢?原来就是ASCII码表( American Standard Code for Information Interchange, ASCII ) 。

URL 只能使用 ASCII 字符集来通过因特网进行发送。

由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。

URL 编码使用 "%" 其后跟随两位的十六进制数来替换非 ASCII 字符。

URL 不能包含空格。URL 编码通常使用 + 来替换空格。

例如:

点击"提交"按钮,浏览器会在发送输入之前对其进行 URL 编码。服务器上的页面会显示出接收到的输入(这里我输入的是“hello  world”),提交后URL后面跟着hello++world,比如http://www.runoob.com/try/html_form_submit.php?text=hello++world

 

【URL编码原因】

 一般开发中,如果一个东西需要被编码,其原因有多种:由于私密信息传输需要被编码、由于传输时内容过大需要编码压缩等等;

而URL编码则是为了解决url中可能存在的字符歧义。

 

【编码函数】

JavaScript、PHP、ASP 都提供了对字符串进行URL编码的函数。

JavaScript 中使用 encodeURI() 函数,PHP 中使用 rawurlencode() 函数,ASP 中使用 Server.URLEncode() 函数

 

【URL 编码参考手册】

举几个简单例子:

ASCII 字符URL-编码
space%20
!%21
"%22
#%23
$%24

 

【url编码】

        url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符,将数据排行等等)作为URL的一部分或者分离地发给服务器。

       任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =,&;,和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”(以上来自百度百科)

【举一个使用场景】

比如页面跳转时的参数,?a=中国人+ ,若直接重定向到此链接,+特殊字符会被过滤掉,此时就需要进行url编码了

js中自带了url编码方法,encodeURI()、encodeURIComponent()

       对应的url解码方法,decodeURI()、decodeURIComponent()

【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编码再进行传输。

 

另外一个问题,就是为什么我们要用ASCII传输,可不可以用别的编码? 

    当然可以用别的编码,你自己可以开发一套编码,然后自己解析。就像大部分国家都有自己的语言一样。那国家之间要交流,怎么办?  用英语把,英语的使用范围最广。

 

【拓展1:浏览器URL编码】

页面中通过请求另一个页面并通过url传递了带有中文的参数,结果在接收端获取参数时乱码了

经检查乱码现象指出新在IE浏览器中,其他浏览器火狐、chrome等不会有问题

【最后的解决方式是:】

手动将此中文进行编码:encodeURI(url)即可

先来看看三个url:

url1. http://hi.baidu.com/爱宝的妍url2. http://hi.baidu.com/%E7%88%B1%E5%AE%9D%E7%9A%84%E5%A6%8D (UTF-8 编码)url3. http://hi.baidu.com/%B0%AE%B1%A6%B5%C4%E5%FB (GBK 编码)

 这三个url指向同一个网页,而且都能够访问。其实,如果你的浏览器是中文环境下的,IE设置“以UTF8发送URL”,那么在IE里输入url1,服务器端得到的是url2;在firefox里输入url1,服务器端得到的是url3。这是为什么呢?听下文分解(分析部分内容转自http://blog.csdn.net/yzhz/archive/2007/07/03/1676796.aspx)。

 

一、问题:

编码问题是学者在web开发过程中经常会遇到问题,网上也有大量相关的文章介绍,但其中很多文章并没有对URL中使用了中文等非ASCII的字符造成服务器后台程序解析出现乱码的问题作出准确的解释和说明。本文将详细介绍由于在URL中使用了中文等非ASCII的字符造成乱码的问题。

1、在URL中中文字符通常出现在以下两个地方:

(1)、Query String中的参数值,比如http://search.china.alibaba.com/search/offer_search.htm?keywords=中国

(2)、servlet path,比如:http://search.china.alibaba.com/selloffer/中国.html

2、出现乱码问题的原因主要是以下几方面:

(1)、浏览器:我们的客户端(浏览器)本身并没有遵循URI编码的规范(http://www.w3.org/International/O-URL-code.html)。

(2)、Servlet服务器:Servlet服务器的没有正确配置。

(3)、开发人员并不了解Servlet的规范和API的含义。

 

二、基础知识:

1、一个http请求经过的几个环节:

浏览器(ie firefox)【get/post】------------>Servlet服务器------------------------------->浏览器显示

                                 编码                   解码成unicode,然后将显示的内容编码          解码

(1) 浏览器把URL(以及post提交的内容)经过编码后发送给服务器。

(2) 这里的Servlet服务器实际上指的是由Servlet服务器提供的servlet实现ServletRequestWrapper,不同应用服务器的servlet实现不同,这