什么是URI和URL
URL是uniform resource locator,统一资源标识符,它就像因特网中的邮政地址,在世界范围内唯一标识并定位信息资源
URL是uniform resource locator,统一资源定位器,它是一种具体的URI,是URI常见的形式之一(它的另外一种形式就是统一资源名-URN),即URL可以用来标识一个资源,而且还指明了如何locate这个资源。
URL是Internet上用来描述信息资源的字符串,URL一般由三部组成
- 协议(或称为服务方式)
- 存有该资源的主机IP地址(有时也包括端口号)
- 主机资源的具体地址。如目录和文件名等
说了那么多其实url
它就是一个网址,只要上网就会用它。
url一般来说只能使用ASCII字符集(英文字母,数字[a-zA-Z0-9],一些特殊字符"$-_.+!*'(),")[不包括双引号]、以及某些保留字(%/. .. # ? ;等),才可以不经过编码直接用于URL。 这意味着,如果url中有汉字,就必须编码后使用.但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致"URL编码"成为了一个混乱的领域。
接着我们用ie(11)和chrome(70.0.3538.102)浏览器做几组实验对比看看 url编码在不同浏览器下的效果
实验一:url地址中含有中文
在浏览器中输入 "zh.wikipedia.org/wiki/春节"
其中ie中的实际地址是 "zh.wikipedia.org/wiki/春节",春节被编码成了 %E6%98%A5%E8%8A%82;春节的utf-8的编码是'e6 98 a5 e8 8a 82',所以对于的url编码就是'%E6%98%A5%E8%8A%82'.chrome中的情况一样.我们得出结论,url编码对浏览器地址的编码是使用了utf-8编码;
备注:urlencoded编码按照一定的编码方式(如:utf-8,gbk等)对url编码成二进制的字节码;然后每个字节用一个包含3个字符的字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式
实验二:url地址参数中含有中文
在浏览器中输入 "www.baidu.com/s?wd=春节" ie中我们发现 GET /s?wd=春节 HTTP/1.1,这个说明ie对url中参数没有进行编码;而chrome中是"www.baidu.com/s?wd=春节",很明显chrome对url中的参数进行的也是utf-8编码;
实验三:ajax的get和post请求中的url编码
实验发现不管是url路径中还是参数中带有中文情况和前面是一样的
前面的几个测试说明不同浏览器的url编码规则确实是不一样的,如果我们在开发的时候需要考虑所有情况,那肯定要崩溃了.那有没有一种方法可以保证客户端只要用一种编码方法向服务器发送请求.
回到是有的,就是javascript先对url进行编码,然后再向服务端发起请求,不给浏览器插手的机会。因为javascript的输出是一致的,这样就可以确保浏览器得到的数据格式也是一致的.
js用于编码的函数有三个 escape、encodeURI、encodeURIComponent
escape
escape已经不建议使用了。
复制代码
escape('Hello World')
"Hello%20World"
复制代码
实际上,escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。 比如"春节"的返回结果是%u6625%u8282,也就是说在Unicode字符集中,"春"是第6625个(十六进制)字符,"节"是第8282个(十六进制)字符。
该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。在\u0000到\u00ff之间的符号被转成%xx的形式,其余符号被转成%uxxxx的形式。对应的解码函数是unescape()。
所以,"Hello World"的escape()编码就是"Hello%20World"。因为空格的Unicode值是20(十六进制)。
`首先,无论网页的原始编码是什么,一旦被Javascript编码,就都变为unicode字符。也就是说,Javascipt函数的输入和输出,默认都是Unicode字符。这一点对下面两个函数也适用。
escape('春节')
"%u6625%u8282"
umescape("%u6625%u8282")
"春节"
复制代码
其次,escape()不对"+"编码。但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时候要小心;
encodeURI()
encodeURI()是Javascript中真正用来对URL编码的函数。 它着眼于对整个URL进行编码,因此除了常见的符号以外,对其他一些在网址中有特殊含义的符号"; / ? : @ & = + $ , #",也不进行编码。编码后,它输出符号的utf-8形式,并且在每个字节前加上%。
它对应的解码函数是decodeURI()。
需要注意的是,它不对单引号'编码。
encodeURIComponent()
最后一个Javascript编码函数是encodeURIComponent()。与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。
因此,"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码。至于具体的编码方法,两者是一样。
它对应的解码函数是decodeURIComponent()。