<iOS>Objective-C对URL尽心URLEncode编码

Objective-CURL尽心URLEncode编码

在iOS程序访问HTTP资源时需要对URL进行Encode,比如像拼出来的http://unmi.cc?p1=%+&sdd&p2=中文,其中的中文、特殊符号&%和空格都必须进行转译才能正确访问。

在Java、.net和JS中都有相应的encodeURL方法可用,在Objective-C语言中,你可以试下

- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;

来对完整的URL(带请求参数的)进行编码,比如执行下面的代码:

NSString *url = @“http://unmi.cc?p1=%+&sd &p2=中文”;

NSString *encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

上面的代码转出的encodedValue是:

http://unmi.cc?p1=%25+&sd%20&p2=%E4%B8%AD%E6%96%87

可见,它不会转换URL中的?%&符号,这也正常,因为它肯定分不出哪个&是参数的连接符号还是参数值,你可以单独编码参数,然后在拼接成URL之前把属性参数值中的?%&等符号分别替换成相应的编码。


或者,还可以试下另外一个方法来单独编码参数值,然后拼接成完整的URL:

/* newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, origString, NULL, NULL, kCFStringEncodingUTF8); */
CF_EXPORT
CFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaveUnescaped, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding); 

参考代码,分别编码前的p1 = %+&sd f&p2=中文,两个参数的代码和结果如下:

NSString *param = @"%+&sd f";

    NSString *encodedValue =

(NSString*)CFURLCreateStringByAddingPercentEscapes(nil,

                                   (CFStringRef)param, nil,

                                (CFStringRef)@"!*'();:@&=+$,/?%#[]",

kCFStringEncodingUTF8);

这样编码出来的 encodedValue %25%2B%26sd%20f,对 ?%& 等符号也会编码的。⽤用上⾯面的代码对 中⽂文进⾏行编码的结果是:%E4%B8%AD%E6%96%87,与前⾯面是⼀一致的。 

实际应⽤用时还是这个 CFURLCreateStringByAddingPercentEscapes ⽅方法⽐比较⽅方便。 


在项⽬目中是使⽤用的 ASIHTTPRequest 组件来访问 URL 的,在使⽤用 ASIFormDataRequest 时发出它 

其中有⼀一个⽅方法: 

- (NSString*)encodeURL:(NSString *)string

{

    NSString *newString = NSMakeCollectable([(NSString

*)CFURLCreateStringByAddingPercentEscapes(

kCFAllocatorDefault,

                                  (CFStringRef)string, NULL, CFSTR(":/?#

[]@!$ &'()*+,;=\"<>%{}|\\^~`"),

                        CFStringConvertNSStringEncodingToEncoding([self

stringEncoding])) autorelease]);

    if (newString) {

        return newString;

    }

return @""; } 

看起来它就是个 Objective-C 版的 encodeURL ⽅方法,可是它声明成了⼀一个实例⽅方法,必须构造出 ASIFormDataRequest 实例才能使⽤用它,在它的⽗父类 ASIHTTPRequest 中都⽆无该⽅方法。现在来试验 ⼀一下这个⽅方法的返回值: 

ASIFormDataRequest *formDataRequest = [ASIFormDataRequest requestWithURL:nil];
NSString *encodedValue1 = [formDataRequest encodeURL:@"%+&sd f"]; NSString *encodedValue2 = [formDataRequest encodeURL:@"中⽂文"]; 

得出的 encodedValue1 encodedValue2 分别是%25%2B%26sd%20f %E4%B8%AD%E6%96%87,和前⾯面是⼀一致的,所以你可以⽤用 ASIFormDataRequest 提供的⽅方式来进⾏行 URLEncode,把这个⽅方法提出为⼀一个⼯工具⽅方法即可。 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值