? ? ? ?今天遇到一個(gè)問題艺沼,跨域調(diào)其他系統(tǒng)接口扒秸,需要傳一個(gè)回調(diào)地址過去昨登,由于是單頁(yè)面應(yīng)用趾代,回調(diào)地址中存在特殊字符‘#’和‘?’,想著用字符轉(zhuǎn)碼在傳過去丰辣,于是就想到了js原生的3個(gè)常用的轉(zhuǎn)碼(解碼)函數(shù):escape(unescape),encodeURI(decodeURI),encodeURIComponent(decodeURIComponent)撒强。
escape(),不會(huì)對(duì) ASCII 字母和數(shù)字進(jìn)行編碼丈甸,也不會(huì)對(duì)下面這些 ASCII 標(biāo)點(diǎn)符號(hào)進(jìn)行編碼: * @ - _ + . / 。其他所有的字符都會(huì)被轉(zhuǎn)義序列替換尿褪。
encodeURI(),不會(huì)對(duì) ASCII 字母和數(shù)字進(jìn)行編碼睦擂,也不會(huì)對(duì)這些 ASCII 標(biāo)點(diǎn)符號(hào)進(jìn)行編碼: - _ . ! ~ * ' ( ) ,它的目的是對(duì) URI 進(jìn)行完整的編碼,因此對(duì)以下在 URI 中具有特殊含義的 ASCII 標(biāo)點(diǎn)符號(hào)杖玲,encodeURI() 函數(shù)是不會(huì)進(jìn)行轉(zhuǎn)義的:;/?:@&=+$,#(地址欄中如果有#和顿仇?,并且需要用來(lái)算簽名的時(shí)候就不要用這個(gè)方法了)
encodeURIComponent(),不會(huì)對(duì) ASCII 字母和數(shù)字進(jìn)行編碼摆马,也不會(huì)對(duì)這些 ASCII 標(biāo)點(diǎn)符號(hào)進(jìn)行編碼: - _ . ! ~ * ' ( ),其他字符(比如 :;/?:@&=+$,# 這些用于分隔 URI 組件的標(biāo)點(diǎn)符號(hào))臼闻,都是由一個(gè)或多個(gè)十六進(jìn)制的轉(zhuǎn)義序列替換的。
例如囤采,我的回調(diào)地址是:http://www.liantiao.com/#/orderDetail/T20160406201024825述呐,把這個(gè)回調(diào)地址作為參數(shù)跨域請(qǐng)求其他api接口,對(duì)方需要對(duì)比參數(shù)簽名的蕉毯,所以乓搬,就要把#等特殊字符進(jìn)行轉(zhuǎn)義,這里我用了encodeURIComponent()函數(shù)代虾,轉(zhuǎn)義之后是:"http%3A%2F%2Fwww.liantiao.com%2F%23%2ForderDetail%2FT20160406201024825"