JS中URL中的特殊字符问题:escape,encodeURI,encodeURIComponent

原创 2016年08月30日 17:09:55

     在使用url进行参数传递时,经常会传递一些中文名(或含有特殊字符)的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原来发生不一致。使用服务器端的urlEncode函数编码的URL,与使用客户端javascript的encodeURI函数编码的URL,结果就不一样。javascript对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码数:unescape,decodeURI,decodeURIComponent。


javaScript中的编码方法:

escape() 方法:采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。

比如,空格符对应的编码是%20。unescape方法与此相反。

该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。


encodeURI()方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。

该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。

该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#

提示:如果 URI 组件中含有分隔符,比如 ? 和 #,则应当使用 encodeURIComponent() 方法分别对各组件进行编码。

例子:color:#ff0000;必须要用encodeURIComponent处理。


encodeURIComponent()方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码

该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。

其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。


因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者encodeURIComponent。


另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有。


1、  传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。

例如:<script language="javascript">document.write('<a href="http://passport.baidu.com/?logout&aid=7&u='+encodeURIComponent("http://cang.baidu.com/bruce42")+'">退出</a>');</script>

2、  进行url跳转时可以整体使用encodeURI。例如:Location.href=encodeURI("http://cang.baidu.com/do/s?word=百度&ct=21");

3、  js使用数据时可以使用escape例如:搜藏中history纪录。

4、  escape0-255以外的unicode值进行编码时输出%u****格式,其它情况下escapeencodeURIencodeURIComponent编码结果相同。


最多使用的应为encodeURIComponent,它是将中文、韩文等特殊字符转换成utf-8格式的url编码,所以如果给后台传递参数需要使用encodeURIComponent时需要后台解码对utf-8支持(form中的编码方式和当前页面编码方式相同)

escape不编码字符有69个:*+-./@_0-9a-zA-Z

encodeURI不编码字符有82个:!#$&'()*+,-./:;=?@_~0-9a-zA-Z

encodeURIComponent不编码字符有71个:! '()*-._~0-9a-zA-Z

项目中发现,直接对url中的参数部分做encodeURI()编码转换,后台servlet通过getParamater()获取时,不需要转换可以直接获取到正确的值。说明:参数没有用到中文,框架用的是struts框架。



ps:使用get方法请求服务器时,如果url含有#符号,那么浏览器自动截断#字符和其后面的值。

解决办法:

方法1:通过post方式传递数据;含有特殊字符的字符串不会被截断,会被原原本本地传到server。
方法2:对参数进行一次编码parameter=escape(parameter);


JS 字符串编码函数(解决URL特殊字符传递问题):escape()、encodeURI()、encodeURIComponent()区别详解

JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod...
  • jumtre
  • jumtre
  • 2016年05月13日 11:16
  • 3324

URL中的特殊字符问题escape,encodeURI,encodeURIComponent

在使用url进行参数传递时,经常会传递一些中文名(或含有特殊字符)的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原...
  • yigui2001
  • yigui2001
  • 2008年01月09日 11:28
  • 666

JS中URL中的特殊字符问题(escape,encodeURI,encodeURIComponent)

escape,encodeURI,encodeURIComponent 在使用url进行参数传递时,经常会传递一些中文名(或含有特殊字符)的参数或URL地址,在后台处理时会发生转换错误。在有些传...
  • xiongyayun428
  • xiongyayun428
  • 2011年11月01日 21:56
  • 1373

为什么需要JS里常需要做两次encodeURI(url)

最近项目里经常出现前后端传送出现乱码的情况,不少同事问一为什么经常需要在JS里进行两次编码,这里进行下说明: 一般情况下, 发送 encodeURIComponent(parmeName)+...
  • posonrick
  • posonrick
  • 2016年05月31日 09:13
  • 3781

开发日志:js使用encodeURI要注意null,防止传递undefined

查询条件使用js跳转url,在传递中文参数的使用到了encodeURI,搜索后发现后台数据查不出来 debug后发现SQL查询在where条件中有个参数值是undefined 回到js去排查错...
  • kaidishi
  • kaidishi
  • 2014年03月25日 11:23
  • 830

JS中encodeURIComponent(URL)编码与decodeURIComponent(URL)解码详解

(1)   encodeURIComponent(url) 函数 定义和用法        encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。 语法       ...
  • li2327234939
  • li2327234939
  • 2016年12月15日 20:26
  • 25536

JS中URL中的特殊字符问题:escape,encodeURI,encodeURIComponent

在使用url进行参数传递时,经常会传递一些中文名(或含有特殊字符)的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原...
  • denuvead
  • denuvead
  • 2008年09月03日 12:26
  • 10706

移动端某些浏览器cookie无法识别中文encodeURI 、 encodeURIComponent 、escape

问题描述 比如qq浏览器无法识别中午 ,getcookie的时候为空 那么在setcookie的时候进行编码,然后在getcookie的时候再解码 编码的三个方法 encodeURI ...
  • kongjiea
  • kongjiea
  • 2016年12月08日 17:24
  • 723

escape,encodeURI,encodeURIComponent的有什么区别?

一、escape和它们不是同一类 简单来说,escape是对字符串(string)进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读。 编码之后的效果是%XX或者%uXXXX这种形...
  • Erica_1230
  • Erica_1230
  • 2014年06月28日 10:34
  • 310

使用js的encodeURI和encodeURIComponent编码后,java解析乱码

地址栏中出现汉字的情况有两种:一种是汉字出现在URL的路径部分;另一种是汉字出现在URL的传参的部分。 第二种情况的时候必须采用编码后传参。 原理: 在浏览器地址栏里,浏览器认为%是个转义字符,...
  • makyan
  • makyan
  • 2016年06月12日 11:02
  • 3378
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JS中URL中的特殊字符问题:escape,encodeURI,encodeURIComponent
举报原因:
原因补充:

(最多只允许输入30个字)