URL编码又称为百分号编码,编码方式很简单,就是把单个字节用16进制表示,然后在其前面放置一个百分号。
比如有"abc"这样一个串,我们把他转换成ascii的字节序后,用16进制表示成这样:
61 62 63
把他进行百分号编码就是在各个字节前加上“%”,结果如下:
%61%62%63
在URL的表示中并非所有的字符都需要进行百分号编码,RFC3986(URI规范)中规定保留字符和非保留字符可以不用编码,其它字符必须用百分号编码。
RFC1738(URL规范)规定保留和非保留字符可以直接用于URL中。
保留字符:
! * ' ( ) ; : @ & = + $ , / ? # [ ]
非保留字符:
a-z A-Z 0-9 - _ . ~
在一个URL中,如果一个保留字符在特定上下文中有特殊含义,而这个保留字在URL中又有特殊目的,那么该字符必须百分号编码。
比如"/",在URL中表示路径分隔符,如果某个路径包含该字符,那么在路径内的该字符就必须进行百分号编码,否则就会和真正的路径分隔符产生歧义.
还有一种需要进行百分号编码的就是”其它字符“,所谓的其它字符就是在保留字符和非保留字符之外的字符,比如ascii码的非显示字符、汉字字符等。
通过前面我们知道,对一个字符进行百分号编码前需要得到该字符的字节流形式,也就是说我们需要根据某种字符编码,将该字符转换成字节流,应该用哪种字符编码(比如GBK、UTF-8等)在RFC1738中并没有给出,所以各个程序(比如浏览器)有自的方式,但是在2005年1月RFC3986做出了强制规定,强制"其它字符"要先转换为UTF-8字节序列,然后对其字节值进行百分号编码。
对"a中"这个字符串对其百分号编码的过程大概如下:
1)将串转换成utf-8编码形式的字节流,那么就是0x61 E4 B8 AD
2)顺序取一个字节,是非保留字?
3)是,则该字节不用编码,直接输出该字节表示的ascii字符
4)不是,则证明该字节需要编码,先输出"%"再输出该字节的16进制大写形式
5)如果还有下一个字节则执行步骤 3),如此循环直到编码完成
6)最后结果 "a%E4%B8%AD"
对"a%E4%B8%AD"串的解码过程如下:
1)将字符串转变为字节流
2)顺序取一个字节,标记字节位置为i,比较该字节是否是'%'
3)不是,直接输出
4)是,取(i+1)位置字节左移4位 + (i+2)位置字节&0xF ,然后输出
5)跳过两个字节,如果还有下一字节则执行步骤 3), 如此循环完成解码
好,有了上面的知识后我们在看一下浏览器对URL的编码是不是跟规范一样。
首先说下URL的组成:
{http://www.jd.com[/app/中国]} ? (name=val中)
{}:代表URL (绝对URI)
[]:代表URI (相对URI,这种标示符依赖具体的环境)
():代表Query String
直接地址栏中输入,对URI则在IE8、chrome、firefox浏览器上发现都是用UTF-8进行百分号编码的.
但是对query string,IE8用的是未经过百分号编码的GBK原码(可能用的操作系统的编码);chrome、firefox上用的是utf-8进行百分号编码。
在网页中嵌套的URL,对于URL的路径部分,IE8、chrom、firefox用的是UTF-8编码进行百分号编码。
对于query string部分,这三种浏览器采用的是http响应头头中的
Content-Type:text/html; charset=gbk 指定;
如果未指定则用页面中的
<meta http-equiv="Content-Type" content="text/html;charset=gbk">指定。
通过以上我们可以知道,各个浏览器对于URL的路径部分使用的编码方式和规范一致,但是对于Query string部分稍有差别.
另外说下javascript的encodeURI()方法,该方法对保留字符不进行编码,比如以下字符不进行编码:
a-z A-Z 0-9 - _ . ! ~ * ' ( ) ; / ? : @ & = + $ , #
所以如果某个URL的数据部分包含特殊的保留字符,用该方法编码该数据后可能无法区分该字符是数据的一部分还是URL的一部分(比如路径分隔符).
所以javascript就有了encodeURIComponent()方法,从名字上就可以看到该方法对URL的"成份"进行编码,用它编码后可以明确区分某个字符是"成份"还是URL的特殊分隔符。
该方法不对非保留字符编码,如:
a-z A-Z 0-9 - _ . ~
其他字符都做编码。
分享到:
相关推荐
URL编码URL编码URL编码URL编码
vb url编码解码vb url编码解码vb url编码解码
搜集了网上的VBA函数,在excel中通过函数将汉字转为两种类型的URL编码,例如将 天空 二字转化为GB2312的“%CC%EC%BF%D5”或者是UTF-8的 “%E5%A4%A9%E7%A9%BA”。方便用于连接转换。VBA相关函数均来自网上,做了小小...
自己写的,可能有bug,请大家一块学习 环境为PB12 函数(及参数) 作用 arraysort 对一维数组进行排序 decto 将十进制数字转成其它进制字符串 ...urlencode 将指定字符串以进行指定字符集url编码 涨价了,哈哈
JS实现URL编码转换中文
C++URL编码和解码
今天写一个POST程序的时候有一段UNICODE字符串需要进行URL编码后进行提交。但是找遍了精易模块和百度都没有说有这这个命令 让Unicode字符串(易语言里面以字节集表示)直接进行正确的URL编码。所以就自己写了一个...
自动判断URL编码的方法。URL中包含编码的中文的时候,程序获取queryString需要根据url的不同编码,采用不同的解码方式,RequestQueryString方法能够自动识别url是用UTF-8编码还是GB2312编码,从而自动获取争取的值。...
这是一个URL编码转码工具,具体的功能和演示不发了。 实际功能是把网址转换为%hex 的形式。 1. 这个曾经是安全领域涉及到SQL注入破解屏蔽字符串的方法之一,但是现在已经很少用了 2. 这曾经是入侵大型网站(特别是...
可以在字符(ASCII、Unicode)和URL编码之间相互转换
url编码转换器url编码转换器
URL编码表一览,可以对照查询,方便编码或者对编码进行反编码
url编码工具,进行gbk格式编码,内涵两个工具类,可以用两种方式编码
URL编码解码器。
ASP.NET-(URL编码解码)开发人员工具ASP.NET-(URL编码解码)开发人员工具ASP.NET-(URL编码解码)开发人员工具ASP.NET-(URL编码解码)开发人员工具ASP.NET-(URL编码解码)开发人员工具ASP.NET-(URL编码解码)开发人员工具
URL编码转换工具 支持url地址的各种编码之间的转换 是网站维护工作必不可少的工具。
asp自定义函数:URL编码和解码
易语言URL编码转换模块源码.写提交的时候可能会用到。
二进制,十六进制,Base64, URL编码,字符编码,反查工具