URL编码CFURLCreateStringByAddingPercentEscapes使用(ARC)
The issue is that by default most of these methods leave characters such as & = ? within a URL, as they are strictly speaking valid. The problem is that these characters have special meanings in a GET request, and will more than likely make your request invalid.
也就是说,你提供的 URL 字符串 里面可能包含某些字符,比如‘$‘ ‘&’ ‘?’...等,这些字符在 URL 语法中是具有特殊语法含义的,
比如 URL :http://www.baidu.com/s?wd=%BD%AA%C3%C8%D1%BF&rsv_bp=0&rsv_spt=3&inputT=3512
中 的 & 起到分割作用 等等,如果 你提供的URL 本身就含有 这些字符,就需要把这些字符 转化为 “%+ASCII” 形式,以免造成冲突。
这就引入:CFURLCreateStringByAddingPercentEscapes 函数。
该函数将 将要添加到URL的字符串进行特殊处理,如果这些字符串含有 &, ? 这些特殊字符,用“%+ASCII” 代替之。
CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (CFStringRef)parameter, NULL,
CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8 );
// 确定 parameter 字符串中含有:/?#[]@!$&’()*+,;= 这些字符时候,这些字符需要被转化,以免与语法冲突,其中空格是默认被转化的,所以没有列出来
例如: 建立一个 NSURL 的 category
+ (NSURL *)URLWithBaseString:(NSString *)baseString parameters:(NSDictionary *)parameters{ NSMutableString *urlString =[NSMutableString string]; //The URL starts with the base string[urlString appendString:baseString]; [urlString appendString:baseString]; NSString *escapedString; NSInteger keyIndex = 0; for (id key in parameters) { //First Parameter needs to be prefixed with a ? and any other parameter needs to be prefixed with an &
if(keyIndex ==0) {
CFStringRef encodedCFString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)[parameters valueForKey:key],nil,CFSTR("?!@#$^&%*+,:;='\"`<>()[]{}/\\| "), kCFStringEncodingUTF8);
escapedString = [[NSString alloc] initWithString:(__bridge_transfer NSString*) encodedCFString];
[urlString appendFormat:@"?%@=%@",key,escapedString]; }else{
CFStringRef encodedCFString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)[parameters valueForKey:key],nil,CFSTR("?!@#$^&%*+,:;='\"`<>()[]{}/\\| "), kCFStringEncodingUTF8);
escapedString = [[NSString alloc] initWithString:(__bridge_transfer NSString*) encodedCFString];
[urlString appendFormat:@"&%@=%@",key,escapedString];
}
keyIndex++; }
return [NSURL URLWithString:urlString];
} @end
调用测试:
NSString * baseString = @"http://twitter.com/statuses/update.xml";
NSDictionary*dictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"This is my status",@"status",@"meng ya", @"meyers",nil];
NSURL * url = [NSURL URLWithBaseString:baseString parameters:dictionary];
NSLog(@"the url : %@", url);
输出:
the url : http://twitter.com/statuses/update.xml?status=This%20is%20my%20status&meyers=meng%20ya
最新文章
- CBitmap、HBITMAP、BITMAP相互转换
- yii2 pjax使用
- 纯脚本组装Json格式字符串
- android sudio 打包资料汇总
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常的解决办法
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(43)-工作流设计-字段分类设计
- GitHub上传不了的解决 ssh: connect to host github.com port 22: Bad file number git did not exit cleanly (exit code 128)
- 让Linux开机运行命令
- Drupal 7 电子邮件的发送设置 SMTP, Mail System, Mime Mail
- 浅谈DevExpress<;三>;:在GridView中加载动态图片
- nuget pack 时不包含依赖包(而不是引用项目的dll,区别于IncludeReferencedProjects)
- Java - 在WebService中使用Client调用三方的RestAPI
- C#核心语法讲解-泛型(详细讲解泛型方法、泛型类、泛型接口、泛型约束,了解协变逆变)
- 学习STM32F769DK-OTA例程之APP中断向量表重映射
- Python数据挖掘(爬虫强化)
- 分布式_zookeeper
- selenium-确认进入了预期页面(四)
- CSS文字过多显示省略号
- 解决oracle语句中 含数字的字符串按数字排序问题
- Jetty使用内存过大的解决方案