/ 前端基础

URI编码时遇到特殊字符的处理方式

今天遇到一个问题,在向一个地址发起get请求时,某个参数是这种形式:foo=xx&&yyyy,其中"&&"是参数值的一部分,在调用这个接口时,后台收到的参数值不正确,变成了这种形式:

name: xx
(empty)
yyyy:

这个传递的参数是encodeURI处理过的,本以为encodeURI后就万无一失了,不过从请求参数来看,encodeURI并不能应对这种情况,出现这个错误可以观察出来,是因为:当遇到第一个&时,被解析为一个新的参数,于是第一个参数foo的值为xx,由于第一个&又紧跟了一个&,于是这个参数没有name和value,被解析成(empty),第二个&后面name被解析为yyyy,导致出现了现在的错误。

通过搜索,发现了原来encodeURI是用于对URI进行编码的,它不能编码这些字符:;/?:@&=+$,#,对于参数的编码要使用encodeURIComponent方法。

文章详见:escape()、encodeURI()、encodeURIComponent()区别详解。这篇文章还详细比较了escape, encodeURI, encodeURIComponent方法的区别,值得一看。

总结

对于整个URI的编码,使用encodeURI,对于某个参数的编码,使用encodeURIComponent。