為什么要進(jìn)行URL編碼?。?!
互聯(lián)網(wǎng)架構(gòu)師后臺回復(fù) 2T 有特別禮包
我們都知道Http協(xié)議中參數(shù)的傳輸是"key=value"這種簡直對形式的,如果要傳多個參數(shù)就需要用“&”符號對鍵值對進(jìn)行分割。
如"?name1=value1&name2=value2",這樣在服務(wù)端在收到這種字符串的時候,會用“&”分割出每一個參數(shù),然后再用“=”來分割出參數(shù)值。
針對“name1=value1&name2=value2”我們來說一下客戶端到服務(wù)端的概念上解析過程:
上述字符串在計算機(jī)中用ASCII嗎表示為:
現(xiàn)在有這樣一個問題,如果我的參數(shù)值中就包含=或&這種特殊字符的時候該怎么辦?
如何解決上述問題帶來的歧義呢?解決的辦法就是對參數(shù)進(jìn)行URL編碼
另外一個問題,就是為什么我們要用ASCII傳輸,可不可以用別的編碼?
預(yù)備知識:URI是統(tǒng)一資源標(biāo)識的意思,通常我們所說的URL只是URI的一種。典型URL的格式如下所示。下面提到的URL編碼,實(shí)際上應(yīng)該指的是URI編碼。
哪些字符需要編碼
RFC3986文檔規(guī)定,Url中只允許包含英文字母(a-zA-Z)、數(shù)字(0-9)、-_.~4個特殊字符以及所有保留字符。RFC3986文檔對Url的編解碼問題做出了詳細(xì)的建議,指出了哪些字符需要被編碼才不會引起Url語義的轉(zhuǎn)變,以及對為什么這些字符需要編碼做出了相應(yīng)的解釋。
US-ASCII字符集中沒有對應(yīng)的可打印字符:
Url中只允許使用可打印字符。US-ASCII碼中的10-7F字節(jié)全都表示控制字符,這些字符都不能直接出現(xiàn)在Url中。同時,對于80-FF字節(jié)(ISO-8859-1),由于已經(jīng)超出了US-ACII定義的字節(jié)范圍,因此也不可以放在Url中。搜索公眾號互聯(lián)網(wǎng)架構(gòu)師復(fù)“2T”,送你一份驚喜禮包。
還有一些字符(!><'()*+,;=)用于在每個組件中起到分隔作用的,如=用于表示查詢參數(shù)中的鍵值對,&符號用于分隔查詢多個鍵值對。當(dāng)組件中的普通數(shù)據(jù)包含這些特殊字符時,需要對其進(jìn)行編碼。
如何對Url中的非法字符進(jìn)行編碼
Url編碼通常也被稱為百分號編碼(Url Encoding,also known as percent-encoding),是因?yàn)樗木幋a方式非常簡單,使用%百分號加上兩位的字符——0123456789ABCDEF——代表一個字節(jié)的十六進(jìn)制形式。
Url編碼默認(rèn)使用的字符集是US-ASCII。例如a在US-ASCII碼中對應(yīng)的字節(jié)是0x61,那么Url編碼之后得到的就是%61,我們在地址欄上輸入http://g.cn/search?q=%61%62%63,實(shí)際上就等同于在google上搜索abc了。又如@符號在ASCII字符集中對應(yīng)的字節(jié)為0x40,經(jīng)過Url編碼之后得到的是%40。
Javascript中的escape, encodeURI和encodeURIComponent的區(qū)別
這種方式已經(jīng)被W3C廢棄了。但是在ECMA-262標(biāo)準(zhǔn)中仍然保留著escape的這種編碼語法。encodeURI和encodeURIComponent則使用UTF-8對非ASCII字符進(jìn)行編碼,然后再進(jìn)行百分號編碼。這是RFC推薦的。因此建議盡可能的使用這兩個函數(shù)替代escape進(jìn)行編碼。
表單提交
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
</head>
<body>
<script type="text/javascript">
document.write(encodeURI("中文"));
</script>
</body>
</html>
感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。
正文結(jié)束
1.心態(tài)崩了!稅前2萬4,到手1萬4,年終獎扣稅方式1月1日起施行~
2.深圳一普通中學(xué)老師工資單曝光,秒殺程序員,網(wǎng)友:敢問是哪個學(xué)校畢業(yè)的?
3.從零開始搭建創(chuàng)業(yè)公司后臺技術(shù)棧


