URL中特殊字符的转义

地址

转义原因:避免引起歧义

现在URL会使用key=value的形式传参,键值对间使用&分隔,如/s?username=abc& password=123&fff。正常来说,第一对键值是username=abc,第二对键值是password=123&fff。然而第二队键值对中的value的值包含了特殊字符&,URL会根据这个字符分隔字符串,这就导致接收URL的服务器解析错误了。所以我们需要对会引起歧义的URL字符进行转义。

URL编码原则:

使用安全的字符(没有特殊用途或特殊意义的可打印字符)去表示那些不安全的字符。
那么那些是安全的字符,那些不是呢?
文档规定URL中只允许包含英文字符(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。
保留字符:
用作分隔不同组件的。我们知道URL可以划分为不同的部分,如·协议、主机、路径等。因此计算机保留了一些字符用作分隔的标记,如冒号用于分隔协议和主机,/用于分隔 主机和路径,?用于分隔路径和查询参数等。还有一些字符(!$&'()*+,;=)用于在每个组件中起到分隔作用的,如=用于表示查询参数中 的键值对,&符号用于分隔查询多个键值对。当组件中的普通数据包含这些特殊字符时,需要对其进行编码。
指定的保留字符:

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

注意:对于合法字符来说,编码和不编码是等价的。但是对于上面提到的,如果不经过编码,那么可能造成URL语义不同。因此对于URL,至于普通英文和数字、特殊字符$-_.+!*'()还有保留 字符,才能出现在未经编码的URL中。其他字符则都需要经过编码才能出现在URL中。

Url编码(也叫百分比编码:url encoding, or percent-encoding)

对于Url的非法字符,必须进过编码才能出现在url中,而目前采用的百分比编码,就是将字符转为对应的16进制标量,然后每2位16进制标量前添加一个『%』。如a的16进制ascii是61,那么百分比编码后值是%61。而非ascii字符,如中文,则先使用utf8编码后,在进行百分号编码。如『乐』的utf8编码是E4B990,所以它的百分比编码结果是%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或者参数中有特殊字符时,不用特殊处理,因为Alamofire已经为你处理好了)

主动处理方式

        let myString = "乐"
        //百分比编码,参数表示特殊字符的种类
        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)
        }
结果:
%3D123%2F
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,639评论 18 139
  • 本人今年22岁,大学毕业一年了,专科学的会计,但是大学里可以说是基本没学,毕业了才考出来会计从业资格证,然后在家学...
    伊斯达阅读 205评论 1 0
  • 南京雪糕网络科技有限公司校园招聘即将开启,欢迎对游戏行业感兴趣的应届毕业生加入雪糕这个大家庭! 南京雪糕网络科技有...
    雪糕游戏社阅读 537评论 0 0
  • 2016/7/14 潮湿炎热的夏天 1.跑步加刺绣。 2.小确幸:新的工牌。
    新鲜wendy阅读 139评论 0 0
  • 以后要少吃油,多吃蛋白质还有蔬菜,感觉油腻的东西吃多了,整个人的脑袋都不好使了。还买了一本书,叫本能减脂,涉及面很...
    假装说晚安阅读 165评论 0 1