URL中特殊字符的轉(zhuǎn)義

地址

轉(zhuǎn)義原因:避免引起歧義

現(xiàn)在URL會(huì)使用key=value的形式傳參笛谦,鍵值對(duì)間使用&分隔详炬,如/s?username=abc& password=123&fff裙品。正常來(lái)說(shuō)忍宋,第一對(duì)鍵值是username=abc帝火,第二對(duì)鍵值是password=123&fff溜徙。然而第二隊(duì)鍵值對(duì)中的value的值包含了特殊字符&,URL會(huì)根據(jù)這個(gè)字符分隔字符串湃缎,這就導(dǎo)致接收URL的服務(wù)器解析錯(cuò)誤了。所以我們需要對(duì)會(huì)引起歧義的URL字符進(jìn)行轉(zhuǎn)義蠢壹。

URL編碼原則:

使用安全的字符(沒(méi)有特殊用途或特殊意義的可打印字符)去表示那些不安全的字符嗓违。
那么那些是安全的字符,那些不是呢图贸?
文檔規(guī)定URL中只允許包含英文字符(a-zA-Z)蹂季、數(shù)字(0-9)、-_.~4個(gè)特殊字符以及所有保留字符疏日。
保留字符:
用作分隔不同組件的乏盐。我們知道URL可以劃分為不同的部分,如·協(xié)議制恍、主機(jī)、路徑等神凑。因此計(jì)算機(jī)保留了一些字符用作分隔的標(biāo)記净神,如冒號(hào)用于分隔協(xié)議和主機(jī),/用于分隔 主機(jī)和路徑溉委,?用于分隔路徑和查詢參數(shù)等鹃唯。還有一些字符(!$&'()*+,;=)用于在每個(gè)組件中起到分隔作用的,如=用于表示查詢參數(shù)中 的鍵值對(duì)瓣喊,&符號(hào)用于分隔查詢多個(gè)鍵值對(duì)坡慌。當(dāng)組件中的普通數(shù)據(jù)包含這些特殊字符時(shí),需要對(duì)其進(jìn)行編碼藻三。
指定的保留字符:

不安全字符:
有些字符在URL中會(huì)引起解析程序的歧義洪橘。具體原因有很多:

注意:對(duì)于合法字符來(lái)說(shuō),編碼和不編碼是等價(jià)的棵帽。但是對(duì)于上面提到的熄求,如果不經(jīng)過(guò)編碼,那么可能造成URL語(yǔ)義不同逗概。因此對(duì)于URL弟晚,至于普通英文和數(shù)字、特殊字符$-_.+!*'()還有保留 字符逾苫,才能出現(xiàn)在未經(jīng)編碼的URL中卿城。其他字符則都需要經(jīng)過(guò)編碼才能出現(xiàn)在URL中。

Url編碼(也叫百分比編碼:url encoding, or percent-encoding)

對(duì)于Url的非法字符铅搓,必須進(jìn)過(guò)編碼才能出現(xiàn)在url中瑟押,而目前采用的百分比編碼,就是將字符轉(zhuǎn)為對(duì)應(yīng)的16進(jìn)制標(biāo)量狸吞,然后每2位16進(jìn)制標(biāo)量前添加一個(gè)『%』勉耀。如a的16進(jìn)制ascii是61指煎,那么百分比編碼后值是%61。而非ascii字符便斥,如中文至壤,則先使用utf8編碼后,在進(jìn)行百分號(hào)編碼枢纠。如『樂(lè)』的utf8編碼是E4B990像街,所以它的百分比編碼結(jié)果是%E4%B9%90。

Swift中的編碼過(guò)程

        Alamofire.request("http://hanxiao.52kjg.cn/Api/index.php", method: .post, parameters: params, encoding: URLEncoding.default).responseJSON 

我們常用的Alamofire晋渺,上面代碼中的encoding就是URL編碼過(guò)程镰绎。(所以我們使用Alamofire時(shí), url或者參數(shù)中有特殊字符時(shí)木西,不用特殊處理畴栖,因?yàn)锳lamofire已經(jīng)為你處理好了)

主動(dòng)處理方式

        let myString = "樂(lè)"
        //百分比編碼,參數(shù)表示特殊字符的種類
        let percentEncode = myString.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)
        print(percentEncode)
        
        //解碼百分比的編碼
        let decoding = percentEncode?.removingPercentEncoding
        print(decoding)

上面方法不能對(duì)一些保留字符處理,如『=』八千。真TM坑吗讶。另外一種方法:地址:https://stackoverflow.com/questions/24551816/swift-encode-url/24552028#

        let myString = "=123/"
        let allowedCharacterSet = (CharacterSet(charactersIn: "!*'();:@&=+$,/?%#[] ").inverted)
        
        if let escapedString = myString.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) {
            print(escapedString)
        }
結(jié)果:
%3D123%2F
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恋捆,隨后出現(xiàn)的幾起案子照皆,更是在濱河造成了極大的恐慌,老刑警劉巖沸停,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膜毁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡愤钾,警方通過(guò)查閱死者的電腦和手機(jī)瘟滨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)能颁,“玉大人室奏,你說(shuō)我怎么就攤上這事【⒆埃” “怎么了胧沫?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)占业。 經(jīng)常有香客問(wèn)我绒怨,道長(zhǎng),這世上最難降的妖魔是什么谦疾? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任南蹂,我火速辦了婚禮,結(jié)果婚禮上念恍,老公的妹妹穿的比我還像新娘六剥。我一直安慰自己晚顷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布疗疟。 她就那樣靜靜地躺著该默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪策彤。 梳的紋絲不亂的頭發(fā)上栓袖,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音店诗,去河邊找鬼裹刮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛庞瘸,可吹牛的內(nèi)容都是我干的捧弃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼擦囊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼塔橡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起霜第,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎户辞,沒(méi)想到半個(gè)月后泌类,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡底燎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年刃榨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片双仍。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枢希,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朱沃,到底是詐尸還是另有隱情苞轿,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布逗物,位于F島的核電站搬卒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏翎卓。R本人自食惡果不足惜契邀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望失暴。 院中可真熱鬧坯门,春花似錦微饥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至允瞧,卻和暖如春简软,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背述暂。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工痹升, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人畦韭。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓疼蛾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親艺配。 傳聞我的和親對(duì)象是個(gè)殘疾皇子察郁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)转唉,斷路器皮钠,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 本人今年22歲麦轰,大學(xué)畢業(yè)一年了,屪┲科學(xué)的會(huì)計(jì)款侵,但是大學(xué)里可以說(shuō)是基本沒(méi)學(xué),畢業(yè)了才考出來(lái)會(huì)計(jì)從業(yè)資格證侧纯,然后在家學(xué)...
    伊斯達(dá)閱讀 206評(píng)論 1 0
  • 南京雪糕網(wǎng)絡(luò)科技有限公司校園招聘即將開啟新锈,歡迎對(duì)游戲行業(yè)感興趣的應(yīng)屆畢業(yè)生加入雪糕這個(gè)大家庭! 南京雪糕網(wǎng)絡(luò)科技有...
    雪糕游戲社閱讀 539評(píng)論 0 0
  • 2016/7/14 潮濕炎熱的夏天 1.跑步加刺繡眶熬。 2.小確幸:新的工牌妹笆。
    新鮮wendy閱讀 141評(píng)論 0 0
  • 以后要少吃油,多吃蛋白質(zhì)還有蔬菜娜氏,感覺(jué)油膩的東西吃多了晾浴,整個(gè)人的腦袋都不好使了。還買了一本書牍白,叫本能減脂脊凰,涉及面很...
    假裝說(shuō)晚安閱讀 166評(píng)論 0 1