zoukankan      html  css  js  c++  java
  • URL编码CFURLCreateStringByAddingPercentEscapes使用(ARC)

     

    URL 编码:CFURLCreateStringByAddingPercentEscapes

     If you have tried to send any information using a GET web request, you would have come cross an annoying problem, That annoying problem is making sure that the URL is corrently encoded.

      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

    @implementation NSURL (mm)
    + (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
  • 相关阅读:
    java中map接口hashMap以及Enty之间的用法和关系
    Collection集合总结,List和set集合的用法,HashSet和LinkedHashSetde用法
    微信小程序开发攻略
    Java闰年的计算,Calendar的用法
    Java计算计算活了多少天
    Java用代码演示String类中的以下方法的用法
    Java判断一个字符串中有多少大写字母、小写字母和数字
    Java将一个字符串的首位改为大写后边改为小写的实现,String
    Java 获取一个字符串中,另一个字符串出现的次数
    linux下重命名文件或文件夹(linux)
  • 原文地址:https://www.cnblogs.com/zhujin/p/3810947.html
Copyright © 2011-2022 走看看