iphone 图片URL地址编码、解码

如果你在做基于RESTFul的应用,你肯定需要对传递的参数进行编码。比如你要传递信息是:

[html]  view plain copy print ?
  1. China,Beijing,Haidian  
经过URL编码后,这个字串成了

[html]  view plain copy print ?
  1. China%20Beijing%20%Haidian  

在iOS中你可以通过如下NSString的方法轻松实现URL编码

[html]  view plain copy print ?
  1. stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding  

相应的,你可以通过下面的方法还原字串:

[html]  view plain copy print ?
  1. stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding  
下面是个完整的例子:

[html]  view plain copy print ?
  1. NSString *rawText = @"One Broadway, Cambridge, MA";  
  2.    
  3. NSString *encodedText = [rawText stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  4. NSLog(@"Encoded text: %@", encodedText);  
  5. NSString *decodedText = [encodedText stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  6. NSLog(@"Original text: %@", decodedText);  

输出是:

[html]  view plain copy print ?
  1. Encoded text: One%20Broadway,%20Cambridge,%20MA  
  2. Original text: One Broadway, Cambridge, MA  
截至到现在,一切都很美好,NSString可以很好的工作。但是stringByAddingPercentEscapesUsingEncoding不能处理iOs的保留字比如&和/.

看看这个例子:

[html]  view plain copy print ?
  1. NSString *rawText = @"Bed Bath & Beyond - URL=http://www.bedbathandbeyond.com/";  
  2.    
  3. NSString *encodedText = [rawText stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  4. NSLog(@"Encoded text: %@", encodedText);  
  5. NSString *decodedText = [encodedText stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  6. NSLog(@"Original text: %@", decodedText);  

输出是:

Bed%20Bath%20&%20Beyond%20-%20URL=http://www.bedbathandbeyond.com/
Original text: Bed Bath & Beyond – URL=http://www.bedbathandbeyond.com/

注意:&和/没有被编码。

当然这种小问题肯定有解决方案,我们看看google是怎么做的。先上源码

[html]  view plain copy print ?
  1. #import "GTMNSString+URLArguments.h"  
  2. #import "GTMGarbageCollection.h"  
  3.   
  4. @implementation NSString (GTMNSStringURLArgumentsAdditions)  
  5.   
  6. - (NSString*)gtm_stringByEscapingForURLArgument {  
  7.   // Encode all the reserved characters, per RFC 3986  
  8.   // (<http://www.ietf.org/rfc/rfc3986.txt>)  
  9.   CFStringRef escaped =   
  10.     CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,  
  11.                                             (CFStringRef)self,  
  12.                                             NULL,  
  13.                                             (CFStringRef)@"!*'();:@&=+$,/?%#[]",  
  14.                                             kCFStringEncodingUTF8);  
  15.   return GTMCFAutorelease(escaped);  
  16. }  
  17.   
  18. - (NSString*)gtm_stringByUnescapingFromURLArgument {  
  19.   NSMutableString *resultString = [NSMutableString stringWithString:self];  
  20.   [resultString replaceOccurrencesOfString:@"+"  
  21.                                 withString:@" "  
  22.                                    options:NSLiteralSearch  
  23.                                      range:NSMakeRange(0, [resultString length])];  
  24.   return [resultString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  25. }  
  26.   
  27. @end  

眼熟么这句NSString (GTMNSStringURLArgumentsAdditions),这不就是用Category给NString添加了一个新的方法么。

如果你把这个文件加入你的工程,好了现在,你的NSString类的实例和子类实例就已经有了支持rfc3968标准的编码和解码能力了。cool吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值