在 iOS 程式通路 HTTP 資源時需要對 URL 進行 Encode,比如像拼出來的 http://unmi.cc?p1=%+&sd f&p2=中文,其中的中文、特殊符号&%和空格都必須進行轉譯才能正确通路。
在 Java、.net 和 JS 中都有相應的 encodeURL 方法可用,在 Objective-C 語言中,你可以試下
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;
來對完整的 URL(帶請求參數的)進行編碼,比如執行下面的代碼:
上面代碼轉換出的 encodedValue 是:
http://unmi.cc?p1=%+&sd &p2=中文
可見,它不會轉換 URL 中的 ?%& 符号,這也正常,因為它肯定分不出哪個 & 是參數的連接配接符号還是參數值,你可以單獨編碼參數,然後在拼接成 URL 之前把屬性參數值中的 ?%& 等符号分别替換成相應的編碼。
或者,您還可以試下另外一個方法來單獨編碼參數值,然後拼接成完整的 URL:
CF_EXPORT
CFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaved, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding);
參考代碼,分别編碼前面的 p1=%+&sd f&p2=中文,兩個參數的代碼和結果如下:
這樣編碼出來的 encodedValue 為 %+&sd f,對 ?%& 等符号也會編碼的。用上面的代碼對 “中文” 進行編碼的結果是:中文,與前面是一緻的。
我實際應用時還是這個 CFURLCreateStringByAddingPercentEscapes 方法比較友善。
我們在項目中是使用的 ASIHTTPRequest 元件來通路 URL 的,在使用 ASIFormDataRequest 時發出它其中有一個方法:
看起來它就是個 Objective-C 版的 encodeURL 方法,可是它聲明成了一個執行個體方法,必須構造出 ASIFormDataRequest 執行個體才能使用它,在它的父類 ASIHTTPRequest 中都無該方法。現在來試驗一下這個方法的傳回值:
得出的 encodedValue1 和 encodedValue2 分别是 %+&sd f 和 中文,和前面是一緻的,是以你可以用 ASIFormDataRequest 提供的方式來進行 URLEncode,把這個方法提出為一個工具方法即可。
本文轉自 卓行天下 51CTO部落格,原文連結:http://blog.51cto.com/9951038/1861476,如需轉載請自行聯系原作者