Objective-C 對 URL 進行 URLEncode 編碼
在 iOS 程序訪問 HTTP 資源時需要對 URL 進行 Encode,比如像拼出來的 +&sd f&p2=中文,其中的中文、特殊符號&%和空格都必須進行轉譯才能正確訪問。
在 Java、.net 和 JS 中都有相應的 encodeURL 方法可用,在 Objective-C 語言中,你可以試下
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;
來對完整的 URL(帶請求參數的)進行編碼,比如執行下面的代碼:
NSString *url=@"+&sd &p2=中文";
NSString *encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
上面代碼轉換出的 encodedValue 是:
+&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(":/ #[]@!$ &'()*+,;=\"$amp; 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,把這個方法提出為一個工具方法即可。;$gt;%{}|\\^~`"),
Objective-C中@property的所有屬性詳解 http://www.linuxidc.com/Linux/2014-03/97744.htm
Objective-C 和 Core Foundation 對象相互轉換的內存管理總結 http://www.linuxidc.com/Linux/2014-03/97626.htm
使用 Objective-C 一年後我對它的看法 http://www.linuxidc.com/Linux/2013-12/94309.htm
10個Objective-C基礎面試題,iOS面試必備 http://www.linuxidc.com/Linux/2013-07/87393.htm
Objective-C適用C數學函數 <math.h> http://www.linuxidc.com/Linux/2013-06/86215.htm
好學的 Objective-C 高清PDF http://www.linuxidc.com/Linux/2014-09/106226.htm