URL編碼淺談

本文是對(duì)在正常網(wǎng)絡(luò)請(qǐng)求的URL中哪些字符需要編碼,為什么需要編碼進(jìn)行了說(shuō)明

URI介紹


URI是統(tǒng)一資源標(biāo)識(shí)的意思卦羡,通常我們所說(shuō)的URL只是URI的一種绿饵。典型URL的格式如上面所示瓶颠。下面提到的URL編碼,實(shí)際上應(yīng)該指的是URI編碼吸祟。

為什么需要URL編碼

通常如果一樣?xùn)|西需要編碼,說(shuō)明這樣?xùn)|西并不適合傳輸屋匕。原因多種多樣,如Size過(guò)大吹埠,包含隱私數(shù)據(jù)疮装,對(duì)于URL來(lái)說(shuō),之所以要進(jìn)行編碼刷袍,是因?yàn)?code>URL中有些字符會(huì)引起歧義樊展。

例如URL參數(shù)字符串中使用key=value鍵值對(duì)這樣的形式來(lái)傳參,鍵值對(duì)之間以&符號(hào)分隔雷酪,如/s?q=abc& ie=utf-8涝婉。如果你的value字符串中包含了=或者&墩弯,那么勢(shì)必會(huì)造成接收URL的服務(wù)器解析錯(cuò)誤,因此必須將引起歧義的&和= 符號(hào)進(jìn)行轉(zhuǎn)義锌钮,也就是對(duì)其進(jìn)行編碼引矩。

又如,Url的編碼格式采用的是ASCII碼兰吟,而不是Unicode茂翔,這也就是說(shuō)你不能在Url中包含任何非ASCII字符履腋,例如中文惭嚣。否則如果客戶端瀏覽器和服務(wù)端瀏覽器支持的字符集不同的情況下晚吞,中文可能會(huì)造成問(wèn)題谋国。

Url編碼的原則就是使用安全的字符(沒有特殊用途或者特殊意義的可打印字符)去表示那些不安全的字符。

哪些字符需要編碼

RFC3986文檔規(guī)定捌蚊,Url中只允許包含英文字母(a-zA-Z)近弟、數(shù)字(0-9)、-_.~4個(gè)特殊字符以及所有保留字符窗宦。

RFC3986文檔對(duì)Url的編解碼問(wèn)題做出了詳細(xì)的建議二鳄,指出了哪些字符需要被編碼才不會(huì)引起Url語(yǔ)義的轉(zhuǎn)變,以及對(duì)為什么這些字符需要編碼做出了相應(yīng)的解釋句占。

US-ASCII字符集中沒有對(duì)應(yīng)的可打印字符

Url中只允許使用可打印字符躯嫉。US-ASCII碼中的10-7F字節(jié)全都表示控制字符,這些字符都不能直接出現(xiàn)在Url中祈餐。同時(shí),對(duì)于80-FF字節(jié)(ISO-8859-1)哺壶,由于已經(jīng)超出了US-ACII定義的字節(jié)范圍山宾,因此也不可以放在Url中鳍徽。

保留字符

Url可以劃分成若干個(gè)組件,協(xié)議绷杜、主機(jī)、路徑等鞭盟。有一些字符(:/?#[]@)是用作分隔不同組件的。例如:冒號(hào)用于分隔協(xié)議和主機(jī)筝野,/用于分隔 主機(jī)和路徑粤剧,?用于分隔路徑和查詢參數(shù),等等途蒋。還有一些字符(!$&'()*+,;=)用于在每個(gè)組件中起到分隔作用的号坡,如=用于表示查詢參數(shù)中 的鍵值對(duì)梯醒,&符號(hào)用于分隔查詢多個(gè)鍵值對(duì)。當(dāng)組件中的普通數(shù)據(jù)包含這些特殊字符時(shí)畜隶,需要對(duì)其進(jìn)行編碼号胚。

不安全字符

還有一些字符,當(dāng)他們直接放在Url中的時(shí)候箱亿,可能會(huì)引起解析程序的歧義弃秆。這些字符被視為不安全字符,原因有很多脑豹。

空格URL在傳輸?shù)倪^(guò)程衡查,或者用戶在排版的過(guò)程,或者文本處理程序在處理Url的過(guò)程击碗,都有可能引入無(wú)關(guān)緊要的空格们拙,或者將那些有意義的空格給去掉引號(hào)以及<> 引號(hào)和尖括號(hào)通常用于在普通文本中起到分隔Url的作用#通常用于表示書簽或者錨點(diǎn)%百分號(hào)本身用作對(duì)不安全字符進(jìn)行編碼時(shí)使用的特殊字符,因此本身需要編碼{}|\^[]~某一些網(wǎng)關(guān)或者傳輸代理會(huì)篡改這些字符

需要注意的是砚婆,對(duì)于URL中的合法字符,編碼和不編碼是等價(jià)的坷虑,但是對(duì)于上面提到的 這些字符迄损,如果不經(jīng)過(guò)編碼,那么它們有可能會(huì)造成Url語(yǔ)義的不同芹敌。因此對(duì)于Url而言氏捞,只有普通英文字符和數(shù)字冒版,特殊字符$-_.+!*'()還有保留 字符,才能出現(xiàn)在未經(jīng)編碼的Url之中捆等。其他字符均需要經(jīng)過(guò)編碼之后才能出現(xiàn)在URL中。

但是由于歷史原因续室,目前尚存在一些不標(biāo)準(zhǔn)的編碼實(shí)現(xiàn)。例如對(duì)于~符號(hào)班缎,雖然RFC3986文檔規(guī)定她渴,對(duì)于波浪符號(hào)~,不需要進(jìn)行URL編碼沉唠,但是還是有很多老的網(wǎng)關(guān)或者傳輸代理會(huì)

如何對(duì)Url中的非法字符進(jìn)行編碼

Url編碼通常也被稱為百分號(hào)編碼(Url Encoding满葛,also known as percent-encoding),是因?yàn)樗木幋a方式非常簡(jiǎn)單嘀韧,使用%百分號(hào)加上兩位的字符——0123456789ABCDEF——代表一個(gè)字節(jié)的 十六進(jìn)制形式。Url編碼默認(rèn)使用的字符集是US-ASCII译蒂。例如a在US-ASCII碼中對(duì)應(yīng)的字節(jié)是0x61谊却,那么Url編碼之后得到的就 是%61,我們?cè)诘刂窓谏陷斎?code>http://g.cn/search?q=%61%62%63捕透,實(shí)際上就等同于在google上搜索abc了碴萧。

需要注意:
正常的使用encode的方法有兩個(gè),兩個(gè)編碼的格式所認(rèn)為的安全字符并不完全一致乒躺,具體如下:

  • encodeURI(82個(gè)) !#$&'()*+,/:;=?@-._~0-9a-zA-Z
  • encodeURIComponent(71個(gè))!'()*-._~0-9a-zA-Z
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嘉冒,一起剝皮案震驚了整個(gè)濱河市咆繁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坏为,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洒忧,死亡現(xiàn)場(chǎng)離奇詭異熙侍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)庆尘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門驶忌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惩系,“玉大人如筛,你說(shuō)我怎么就攤上這事堡牡∥畋” “怎么了妖胀?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵赚抡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盾计,道長(zhǎng)赁遗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任哭尝,我火速辦了婚禮材鹦,結(jié)果婚禮上耕姊,老公的妹妹穿的比我還像新娘。我一直安慰自己箩做,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布醉蚁。 她就那樣靜靜地躺著鬼店,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滥玷。 梳的紋絲不亂的頭發(fā)上巍棱,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天航徙,我揣著相機(jī)與錄音,去河邊找鬼杠袱。 笑死窝稿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伴榔。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼骗灶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秉馏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起免都,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绕娘,失蹤者是張志新(化名)和其女友劉穎栽连,沒想到半個(gè)月后侨舆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挨下,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡臭笆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年秤掌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茵乱。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡似将,死狀恐怖蚀苛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玷氏,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布渗蟹,位于F島的核電站雌芽,受9級(jí)特大地震影響辨嗽,放射性物質(zhì)發(fā)生泄漏世落。R本人自食惡果不足惜屉佳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一武花、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧体箕,春花似錦、人聲如沸累铅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玉雾。三九已至,卻和暖如春轻要,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背驹碍。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工志秃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嚼酝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓钧舌,卻偏偏與公主長(zhǎng)得像涎跨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隅很,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理外构,服務(wù)發(fā)現(xiàn),斷路器审编,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 文/肖肖 昏黃的午后 片片光斑照在盛開的三角梅上 你手捧歷史書 站在光影里 歪著頭 記住了三皇五帝和宋元明清 而我...
    閑說(shuō)雜談閱讀 204評(píng)論 0 0
  • 文/康蜀郡桐 第二天砰嘁,宋源和杜軒上到十二點(diǎn),連家都沒回就急匆匆趕往老板家矮湘。雖然老板昨天對(duì)兩人說(shuō)過(guò)讓他們正常上下班,...
    攀援閱讀 568評(píng)論 0 1
  • 為以上代碼作以下幾點(diǎn)解釋:1磕蛇、上述Handler的作用,是在無(wú)內(nèi)存泄漏的情況下秀撇,為外部Activity的mText...
    Louis_陸閱讀 2,973評(píng)論 1 22