Swift URL encode

转自:https://www.cnblogs.com/luoxiaofu/p/7110011.html

如有侵权,请联系删除。

 

前言

在WEB前端开发,服务器后台开发,或者是客户端开发中,对URL进行编码是一件很常见的事情,但是由于各个年代的RFC文档中的内容一直在变化,一些年代久远的代码就对URL编码和解码的规则和现在的有一些区别。

在1994年订制的RFC1738文档中,对字符串中的除了- _ .之外的所有非字母数字字符都替换成百分号(%)后跟两位十六进制数,十六进制数中字母必须为大写。

在2005年定义的RFC3986中,将针对- _.~四个字符之外的所有非字母数字字符进行百分号编码。当然 根据URL的类型不同,有也一部分预留字符不需要进行编码,例如查询的URL中可以包含? /字符,不需要转义。更详细文档的可以查看RFC 3986

Swift url encode

addingPercentEncoding(withAllowedCharacters:是iOS7之后出现的新API用于url encode

标准转码

所有类型的URL中,"-_.~"都不应该被转码

var str = "-_.~"
var encodeStr = str.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(encodeStr ?? "") // -_.~
var str = "#"
var encodeStr = str.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(encodeStr ?? "") // %23

CharacterSet

CharacterSet是一个结构体,CharacterSet.urlHostAllowed等预制类型包含了所有不需要被转码的字符,反过来说就是指明了需要被转码的字符。CharacterSet类中提供了一些常用的URL转码的类型:

* CharacterSet.urlHostAllowed: 被转义的字符有  "#%/<>?@\^`\{\|\}
* CharacterSet.urlPathAllowed: 被转义的字符有  "#%;<>?[\]^`\{\|\}
* CharacterSet.urlUserAllowed: 被转义的字符有   #%/<>?@\^`\{\|\}
* CharacterSet.urlQueryAllowed: 被转义的字符有  "#%<>[\]^`\{\|\}
* CharacterSet.urlPasswordAllowed 被转义的字符有 "#%/:<>?@[\]^`\{\|\}

为什么说CharacterSet.urlHostAllowed包含的是所有不需要被转码的字符,可以用两句代码验证:

let unicode = "1".unicodeScalars.flatMap{ $0 }[0]

print(CharacterSet.urlHostAllowed.contains(unicode)) //输出TRUE

所以,自定义转码字符的集合应该取反字符集:

let str2 = "#/%/<>?@"
let custom = CharacterSet(charactersIn: "#").inverted
let result = str2.addingPercentEncoding(withAllowedCharacters: custom) ?? ""

print(result) //输出 %23/%/<>?@

可以看到只有#被编码。在一些特殊的需求中会用到自定义编码集合,例如BASE64转码后的URL编码。

Objective-C url encode

API调用都是一样的,不过网上流传的比较多的是用的C API

NSString *ciphertext = @"saf#*&";        
NSCharacterSet *set = [[NSCharacterSet characterSetWithCharactersInString:@"!*'();:@&=+$,/?%#[]"] invertedSet];
        
NSString *resultString = [ciphertext stringByAddingPercentEncodingWithAllowedCharacters: set];

C API

NSString *ciphertext = @"saf#*&";
NSString *encodedStr = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes
                                                     (kCFAllocatorDefault,
                                                      (CFStringRef)ciphertext,
                                                      NULL,
                                                      CFSTR("!*'();:@&=+$,/?%#[]"),
                                                      kCFStringEncodingUTF8));

 

 
 以下是oc对应的字段:
 

stringByAddingPercentEscapesUsingEncoding(只对 `#%^{}[]|\"<> 加空格共14个字符编码,不包括”&?”等符号), ios9将淘汰,建议用stringByAddingPercentEncodingWithAllowedCharacters方法

stringByAddingPercentEncodingWithAllowedCharacters需要传一个

NSCharacterSet对象(关于  NSCharacterSet 这篇 文章说的很好)

如[NSCharacterSet  URLQueryAllowedCharacterSet]

 

URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}

URLHostAllowedCharacterSet      "#%/<>?@\^`{|}

URLPasswordAllowedCharacterSet  "#%/:<>?@[\]^`{|}

URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}

URLQueryAllowedCharacterSet    "#%<>[\]^`{|}

URLUserAllowedCharacterSet      "#%/:<>?@[\]^`

(2)网络访问请求:中文空格字符解码

stringByRemovingPercentEncoding  ----  xcode7可能会提示要将stringByAddingPercentEscapesUsingEncoding替换成此方法,要根据是否是解码来区分

*/

//代替stringByAddingPercentEscapesUsingEncoding

let customAllowedSet =  NSCharacterSet(charactersInString:"`#%^{}\"[]|\\<> ").invertedSet



作者:醋溜草莓便当
链接:http://www.jianshu.com/p/21a21866e379
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted on 2017-12-22 13:58  鬼手渔翁  阅读(1430)  评论(0编辑  收藏  举报

导航