url 编码问题
url的组成:字母、阿拉伯数值、某些标点符号。
不能使用其他文字和符号,比如希腊字母、中文等,因为网络标准RFC 1738 做了硬性规定:
只有字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于 URL。
如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致“URL编码”成为了一个混乱的领域。
情况1:网址路径包含中文
http://zh.wikipedia.org/wiki/春节
网址路径的编码,用的是utf-8编码。
情况2:查询字符包含汉字
查询字符串的编码,用的是操作系统的默认编码
情况3:Get方法生成的URL包含汉字
前面说的是直接输入网址的情况,但是更常见的情况是,在已打开的网页上,直接用Get或Post方法发出HTTP请求。
根据台湾中兴大学吕瑞麟老师的试验 ,这时的编码方法由网页的编码决定,也就是由HTML源码中字符集的设定决定。
GET和POST方法的编码,用的是网页的编码。
情况4:Ajax调用的URL包含汉字
在Ajax调用中,IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是 采用utf-8编码。
JS函数:
escape()
: 它的真正作用是返回一个字符的Unicode编码值- 除了ASCII字母、数字、标点符号
@ * _ + - . /
之外,对其他所有字符进行编码。 - 在
/u0000
到/u00ff
之间的符号被转成%xx
的形式,其余符号被转成%uxxxx
的形式。 - 不对
+
编码。但是在提交表单时,空格会被转化为+
字符。
- 除了ASCII字母、数字、标点符号
encodeURI()
: 它着眼于对整个URL进行编码,因此除了常见的符号以外,对其他一些在网址中有特殊含义的符号;/?:@&=+$,#
也不进行编码。编码后,它输出符号的utf-8形式,并在每个字节前加上%
。encodeURIComponent()
: 它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。因此,;/?:@&=+$,#
这些在encodeURI()
中不被编码的符号,在encodeURIComponent()
中统统会被编码。至于具体的编码方法,两者是一样的。
总结:
- 前端发送请求的时候,中文和一些其他特殊字符不能直接放到URL上,必须转成unicode值,再放上去,而后端拿到的URL,还需要把特定的unicode值转成正常的内容,方便使用。不这样做的话,前后端通信的内容就会乱码。
- 前端如果转码,那么后端便需要解码,反之亦然。