歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Objective-C 對 URL 進展 URLEncode 編碼

Objective-C 對 URL 進展 URLEncode 編碼

日期:2017/3/1 9:36:11   编辑:Linux編程

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

Copyright © Linux教程網 All Rights Reserved