[转]Objective-C 对 URL 进行 URLEncode 编码

80530297 2012-04-23

强烈建议使用

(NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)string,NULL,CFSTR("!*'();:@&=+$,/?%#[]"),kCFStringEncodingUTF8);

替换

stringByAddingPercentEscapesUsingEncoding:

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

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

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

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

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

NSString*encodedValue=[urlstringByAddingPercentEscapesUsingEncoding: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

CFStringRefCFURLCreateStringByAddingPercentEscapes(CFAllocatorRefallocator,CFStringReforiginalString,CFStringRefcharactersToLeaveUnescaped,CFStringReflegalURLCharactersToBeEscaped,CFStringEncodingencoding);

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

NSString*param=@"%+&sdf";

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([selfstringEncoding]))autorelease]);

if(newString){

returnnewString;

}

return@"";

}

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

ASIFormDataRequest*formDataRequest=[ASIFormDataRequestrequestWithURL:nil];

NSString*encodedValue1=[formDataRequestencodeURL:@"%+&sdf"];

NSString*encodedValue2=[formDataRequestencodeURL:@"中文"];

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

摘自:http://unmi.cc/objective-c-urlencode

相关推荐