URL编码

来源:互联网 发布:矩阵理论教材推荐 编辑:程序博客网 时间:2024/06/03 10:38

iOS url编码

CFURLCreateStringByAddingPercentEscapes 方法解释

CFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaveUnescaped, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding);

注释:
参数:
1. allocator: 表示为返回字符串申请内存空间,如果传入NULL或者kCFAllocatorDefault ,表示使用默认的内存分配
2. originalString: 要转义的字符串
3. charactersToLeaveUnescaped:保留字符,这些字符不要转义
4. legalURLCharactersToBeEscaped:可以被转义的字符
5. encoding :转义规则中的编码方式。如果encoding不同,转出来的东西就不一样
返回值:这个方法返回一个转义之后的url

思考:
1. 到底哪些字符需要编码,哪些字符忽略不需要编码?
基于RFC 3986规则,规定的所有非法字符 加上legalURLCharactersToBeEscaped 定义的字符 减掉 charactersToLeaveUnescaped定义的字符
最后这个字符集就是要进行转义的字符集。

所以如果legalURLCharactersToBeEscaped,charactersToLeaveUnescaped 都传入NULL. 表明要转义的字符集就是RFC3986规定的哪些。
2. 如果一个url里面有一部分字符串经过了转义,一部分字符串没有经过转义怎么办?
如下:
http://online.store.com/storefront/?request=get-document&doi=10.1175%2F1520-0426(2005)014%3C1157:DODADSS%3E2.0.CO%3B2
这个url. 如果再直接用CFURLCreateStringByAddingPercentEscapes 会有问题。 一些字符被转义了两次了。

解决方法:先用
CFURLCreateStringByReplacingPercentEscapesUsingEncoding预处理把它恢复到普通字符串,再用CFURLCreateStringByAddingPercentEscapes 编码。参考苹果官方代码

CFStringRef originalURLString = CFSTR("http://online.store.com/storefront/?request=get-document&doi=10.1175%2F1520-0426(2005)014%3C1157:DODADSS%3E2.0.CO%3B2");CFStringRef preprocessedString =    CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, originalURLString, CFSTR(""), kCFStringEncodingUTF8);CFStringRef urlString =    CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, preprocessedString, NULL, NULL, kCFStringEncodingUTF8);url = CFURLCreateWithString(kCFAllocatorDefault, urlString, NULL);

注:解释下CFURLCreateStringByReplacingPercentEscapesUsingEncoding的charactersToLeaveEscaped的参数,类似,它如果传入NULL则任何转义字符都不要变,传入指定字符就是指定字符都不要变,传入CFSTR(“”)则任何字符都要变。(可以参考苹果官方文档)

0 0
原创粉丝点击