iOS HTTP 資源時需要對 URL 進行 Encode

在 iOS 程序訪問 HTTP 資源時需要對 URL 進行 Encode,比如像拼出來的 http://unmi.cc?p1=%+&sd f&p2=中文,其中的中文、特殊符號&%和空格都必須進行轉譯才能正確訪問。

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

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

來對完整的 URL(帶請求參數的)進行編碼,比如執行下面的代碼:

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

上面代碼轉換出的 encodedValue 是:

http://unmi.cc?p1=%+&sd &p2=中文

可見,它不會轉換 URL 中的 ?%& 符號,這也正常,因爲它肯定分不出哪個 & 是參數的連接符號還是參數值,你可以單獨編碼參數,然後在拼接成 URL 之前把屬性參數值中的 ?%& 等符號分別替換成相應的編碼。

或者,您還可以試下另外一個方法來單獨編碼參數值,然後拼接成完整的 URL:


CF_EXPORT
CFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaved, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding);

http://unmi.cc/objective-c-urlencode, 來自

參考代碼,分別編碼前面的 p1=%+&sd f&p2=中文,兩個參數的代碼和結果如下:

NSString *param = @"%+&sd f";     NSString *encodedValue = (NSString*)CFURLCreateStringByAddingPercentEscapes(nil,                                    (CFStringRef)param, nil,                                 (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);

這樣編碼出來的 encodedValue 爲 %+&sd f,對 ?%& 等符號也會編碼的。用上面的代碼對 “中文” 進行編碼的結果是:中文,與前面是一致的。

我實際應用時還是這個 CFURLCreateStringByAddingPercentEscapes 方法比較方便。

我們在項目中是使用的 ASIHTTPRequest 組件來訪問 URL 的,在使用 ASIFormDataRequest 時發出它其中有一個方法:

- (NSString*)encodeURL:(NSString *)string {     NSString *newString = NSMakeCollectable([(NSString *)CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault,  (CFStringRef)string, NULL, CFSTR(":/?#[]@!$ &'()*+,;="<>%{}|\\^~`"),   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 分別是 %+&sd f 和 中文,和前面是一致的,所以你可以用 ASIFormDataRequest 提供的方式來進行 URLEncode,把這個方法提出爲一個工具方法即可。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章