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

地址

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

現(xiàn)在URL會使用key=value的形式傳參,鍵值對間使用&分隔,如/s?username=abc& password=123&fff。正常來說,第一對鍵值是username=abc,第二對鍵值是password=123&fff。然而第二隊鍵值對中的value的值包含了特殊字符&,URL會根據(jù)這個字符分隔字符串,這就導(dǎo)致接收URL的服務(wù)器解析錯誤了。所以我們需要對會引起歧義的URL字符進(jìn)行轉(zhuǎn)義。

URL編碼原則:

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

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

注意:對于合法字符來說,編碼和不編碼是等價的。但是對于上面提到的,如果不經(jīng)過編碼,那么可能造成URL語義不同。因此對于URL,至于普通英文和數(shù)字、特殊字符$-_.+!*'()還有保留 字符,才能出現(xiàn)在未經(jīng)編碼的URL中。其他字符則都需要經(jīng)過編碼才能出現(xiàn)在URL中。

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

對于Url的非法字符,必須進(jìn)過編碼才能出現(xiàn)在url中,而目前采用的百分比編碼,就是將字符轉(zhuǎn)為對應(yīng)的16進(jìn)制標(biāo)量,然后每2位16進(jìn)制標(biāo)量前添加一個『%』。如a的16進(jìn)制ascii是61,那么百分比編碼后值是%61。而非ascii字符,如中文,則先使用utf8編碼后,在進(jìn)行百分號編碼。如『樂』的utf8編碼是E4B990,所以它的百分比編碼結(jié)果是%E4%B9%90。

Swift中的編碼過程

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

我們常用的Alamofire,上面代碼中的encoding就是URL編碼過程。(所以我們使用Alamofire時, url或者參數(shù)中有特殊字符時,不用特殊處理,因為Alamofire已經(jīng)為你處理好了)

主動處理方式

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

上面方法不能對一些保留字符處理,如『=』。真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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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

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