url的转义
今天做下載功能的時(shí)候,遇上需要轉(zhuǎn)義的事情了,就總結(jié)一下;
escape()、encodeURIComponent() 和encodeURI()
我們可以知道:escape()除了 ASCII 字母、數(shù)字和特定的符號(hào)外,對(duì)傳進(jìn)來(lái)的字符串全部進(jìn)行轉(zhuǎn)義編碼,因此如果想對(duì)URL編碼,最好不要使用此方法。而encodeURI() 用于編碼整個(gè)URI,因?yàn)閁RI中的合法字符都不會(huì)被編碼轉(zhuǎn)換。encodeURIComponent方法在編碼單個(gè)URIComponent(指請(qǐng)求參數(shù))應(yīng)當(dāng)是最常用的,它可以講參數(shù)中的中文、特殊字符進(jìn)行轉(zhuǎn)義,而不會(huì)影響整個(gè)URL。
請(qǐng)注意 encodeURIComponent() 函數(shù) 與 encodeURI() 函數(shù)的區(qū)別之處,前者假定它的參數(shù)是 URI 的一部分(比如協(xié)議、主機(jī)名、路徑或查詢字符串)。因此 encodeURIComponent() 函數(shù)將轉(zhuǎn)義用于分隔 URI 各個(gè)部分的標(biāo)點(diǎn)符號(hào)。
一、encodeURI() //轉(zhuǎn)義一個(gè)URI中的字符
語(yǔ)法:encodeURI(uri) //這個(gè)在編碼不同的AJAX請(qǐng)求時(shí),解決中文亂碼問(wèn)題經(jīng)常用到。
var str1 = "你好javascript";
var str2 = encodeURI(str1);
document.write(str2); //輸出%E4%BD%A0%E5%A5%BDjavascript
二、decodeURI() //解碼一個(gè)URI中的字符
語(yǔ)法:decodeURI(uri)
var str1 = "你好javascript";
var str2 = encodeURI(str1);
document.write(str2); //輸出%E4%BD%A0%E5%A5%BDjavascript
var str3 = decodeURI(str2);
document.write("<br/>" + str3) //輸出 你好javascript
三、encodeURIComponent() //轉(zhuǎn)義URI組件中的字符
var str1 = "你好javascript";
var str2 = encodeURIComponent(str1);
document.write(str2); //輸出%E4%BD%A0%E5%A5%BDjavascript
四、decodeURIComponent() //解碼一個(gè)URI組件中的字符
var str1 = "你好javascript";
var str2 = encodeURIComponent(str1);
document.write(str2); //輸出%E4%BD%A0%E5%A5%BDjavascript
var str3 = decodeURIComponent(str2);
document.write("<br/>" + str3) //輸出 你好javascript
五、escape() //編碼一個(gè)字符串
語(yǔ)法:escape(value);
var str = "javascript 你好";
var str1 = escape(str);
document.write(str1); //javascript%20%u4F60%u597D
六、unecape() //解碼一個(gè)由escape()函數(shù)編碼的字符串
window.onload = function () {
var str = "javascript 你好";
var str1 = escape(str);
document.write(str1); //javascript%20%u4F60%u597D
var str2 = unescape(str1);
alert(str2); //彈出 javascript你好
}
補(bǔ)充:url為什么要進(jìn)行轉(zhuǎn)義
針對(duì)“name1=value1&name2=value2”我們來(lái)說(shuō)一下客戶端到服務(wù)端的概念上解析過(guò)程:
上述字符串在計(jì)算機(jī)中用ASCII嗎表示為:
6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532。
6E616D6531:name1
3D:=
76616C756531:value1
26:&
6E616D6532:name2
3D:=
76616C756532:value2
服務(wù)端在接收到該數(shù)據(jù)后就可以遍歷該字節(jié)流,首先一個(gè)字節(jié)一個(gè)字節(jié)的吃,當(dāng)吃到3D這字節(jié)后,服務(wù)端就知道前面吃得字節(jié)表示一個(gè)key,再想后吃,如果遇到26,說(shuō)明從剛才吃的3D到26子節(jié)之間的是上一個(gè)key的value,以此類(lèi)推就可以解析出客戶端傳過(guò)來(lái)的參數(shù)。
現(xiàn)在有這樣一個(gè)問(wèn)題,如果我的參數(shù)值中就包含=或&這種特殊字符的時(shí)候該怎么辦。
比如說(shuō)“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么實(shí)際在傳輸過(guò)程中就會(huì)變成這樣“name1=va&lu=e1”。我們的本意是就只有一個(gè)鍵值對(duì),但是服務(wù)端會(huì)解析成兩個(gè)鍵值對(duì),這樣就產(chǎn)生了奇異。
如何解決上述問(wèn)題帶來(lái)的歧義呢?解決的辦法就是對(duì)參數(shù)進(jìn)行URL編碼
URL編碼只是簡(jiǎn)單的在特殊字符的各個(gè)字節(jié)前加上%,例如,我們對(duì)上述會(huì)產(chǎn)生奇異的字符進(jìn)行URL編碼后結(jié)果:“name1=va%26lu%3D”,這樣服務(wù)端會(huì)把緊跟在“%”后的字節(jié)當(dāng)成普通的字節(jié),就是不會(huì)把它當(dāng)成各個(gè)參數(shù)或鍵值對(duì)的分隔符。
總結(jié)
- 上一篇: base64格式的图片数据如何转成图片
- 下一篇: rman备份类型及删除备份