url编码
使用ASCII码传输,任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码。
URL编码只是简单的在特殊字符的各个字节前加上%,例如,name=a&b=解释为key为name,值为a&b=,对字符进行URL编码后结果:“name=a%26b%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,而不是各个参数或键值对的分隔符。
网络标准RFC1738规定:
只有字母和数字[0-9a-zA-Z]、一些特殊符号"$-_.+!*'(),"[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。
所以若URL中包括中文等字符,就必须经过编码后使用,否则传给服务器的request URL就会包含乱码,服务器无法正确识别。RFC1738没有规定具体编码方法,由浏览器自己决定,因此url编码比较混乱。
不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果,为了保证客户端只用一种编码方法向服务器发出请求,可以使用Javascript先对URL编码,然后再向服务器提交。
| 方法 | 规则 | 特点 |
|---|---|---|
| escape() unescape() | 除了ASCII字母、数字、标点符号"@ * _ + - . /"以外,对其他所有字符进行编码 | 现在已经不提倡使用这种方法了,它不能直接运用与URL编码,它的真正作用是返回一个字符的Unicode编码值 |
| encodeURI() decodeURI() | 除了常见的符号以外,对其他一些在网址中有特殊含义的符号"; / ? : @ & = + $ , #",也不进行编码 | encodeURI()是Javascript中真正用来对URL编码的函数,它着眼于对整个URL进行编码 |
| encodeURIComponent() decodeURIComponent() | 在encodeURI()中不被编码的符号"; / ? : @ & = + $ , #",在encodeURIComponent()中统统会被编码 | 在encodeURI()中不被编码的符号"; / ? : @ & = + $ , #",在encodeURIComponent()中统统会被编码 |