今天遇到一个问题,跨域调其他系统接口,需要传一个回调地址过去,由于是单页面应用,回调地址中存在特殊字符‘#’和‘?’,想着用字符转码在传过去,于是就想到了js原生的3个常用的转码(解码)函数:escape(unescape),encodeURI(decodeURI),encodeURIComponent(decodeURIComponent)。

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

  encodeURI(),不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) ,它的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#(地址栏中如果有#和?,并且需要用来算签名的时候就不要用这个方法了)

  encodeURIComponent(),不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ),其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。

例如,我的回调地址是:http://www.liantiao.com/#/orderDetail/T20160406201024825,把这个回调地址作为参数跨域请求其他api接口,对方需要对比参数签名的,所以,就要把#等特殊字符进行转义,这里我用了encodeURIComponent()函数,转义之后是:"http%3A%2F%2Fwww.liantiao.com%2F%23%2ForderDetail%2FT20160406201024825"