從此不再懼怕URI編碼:JavaScript及C# URI編碼詳解

混亂的URI編碼

JavaScript中編碼有三種方法:escape、encodeURI、encodeURIComponent

C#中編碼主要方法:HttpUtility.UrlEncode、Server.UrlEncode、Uri.EscapeUriString、Uri.EscapeDataString

JavaScript中的還好,只提供了三個(gè),C#中主要用的就有這么多,還沒(méi)有列出其他編碼(HTML),一多就弄不明白,弄不明白就心生恐懼,心生恐懼就變得苦逼,本文就向大家詳細(xì)解釋在JavaScript及C#中如何對(duì)URI進(jìn)行編碼的方法(注:本文不涉及到其他編碼)。

escape:不推薦使用

原因:eacape是BOM中的方法,只能對(duì)ASCII符號(hào)正確編碼,而encodeURI、encodeURIComponent可以對(duì)所有的Unicode符號(hào)編碼。ECMAScript v3 反對(duì)使用該方法,應(yīng)用使用 decodeURI() 和 decodeURIComponent() 替代它。

escape不編碼字符有69個(gè):*,+,-,.,/,@,_,0-9,a-z,A-Z

encodeURI:用于對(duì)網(wǎng)址編碼(不包含參數(shù))

encodeURI不編碼字符有82個(gè):!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

encodeURI就是為這個(gè)而設(shè)計(jì)的。encodeURI不對(duì)URI中的特殊字符進(jìn)行編碼,如冒號(hào)(:)、斜杠(/)。下面看個(gè)示例:

encodeURI("http://www.cnblogs.com/a file with spaces.html")

//outputs http://www.cnblogs.com/a%20file%20with%20spaces.html

可以看到僅僅把空格替換成了20%,所以此方法可用于對(duì)網(wǎng)址進(jìn)行編碼。

由于encodeURI不對(duì)冒號(hào)(:)、斜杠(/)進(jìn)行編碼,所以如果參數(shù)(如把網(wǎng)址作為參數(shù))中包含冒號(hào)(:)、斜杠(/),就會(huì)解析出錯(cuò),所以此方法不能對(duì)參數(shù)進(jìn)行編碼。

encodeURIComponent:用于對(duì)網(wǎng)址參數(shù)進(jìn)行編碼

encodeURIComponent不編碼字符有71個(gè):!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

可以看到此方法對(duì):/都進(jìn)行了編碼,所以不能用它來(lái)對(duì)網(wǎng)址進(jìn)行編碼。由于此方法對(duì)中文,空格,井號(hào)(#),斜線(/),冒號(hào)(:)都進(jìn)行了編碼,所以適合對(duì)URI中的參數(shù)進(jìn)行編碼??聪旅娴氖纠?/p>

varparam="博客園";

varurl="http://www.cnblogs.com/?key="+encodeURIComponent(param)+"&page=1";

console.log(url);//outputs http://www.cnblogs.com/?key=%E5%8D%9A%E5%AE%A2%E5%9B%AD&page=1

可以看到,這正是我們想要的結(jié)果(這里只對(duì)需要編碼的參數(shù)(page=1不需要編碼)進(jìn)行了編碼)。

作者:Hegel_SU

鏈接:http://www.itdecent.cn/p/288462ffc6bf

來(lái)源:簡(jiǎn)書(shū)

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,555評(píng)論 19 139
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,679評(píng)論 0 4
  • 本文是看了極客學(xué)院教學(xué)視頻后整理的一點(diǎn)筆記,分享出來(lái),大家討論,不喜勿噴,謝謝。原視頻地址:極客學(xué)院-用戶研究的法...
    _陳陌先生_閱讀 1,113評(píng)論 3 5
  • 也許是最近聽(tīng)馬頔的歌聽(tīng)了太多,莫名其妙就想起了一些事情,莫名其妙就有了一些傷感。 我有一個(gè)朋友,在西安打工,他特別...
    拖油瓶先生閱讀 244評(píng)論 0 1
  • 一位夫人打電話給建筑師,說(shuō)每當(dāng)火車經(jīng)過(guò)時(shí),她的睡床就會(huì)搖動(dòng)。 “這簡(jiǎn)直是無(wú)稽之談1建筑師回答說(shuō),“我來(lái)看看?!?..
    伊滴墨閱讀 573評(píng)論 0 3

友情鏈接更多精彩內(nèi)容