[转]Objective-C 对 URL 进行 URLEncode 编码
强烈建议使用
(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