在 iOS 程序訪(fǎng)問(wèn) HTTP 資源時(shí)需要對(duì) URL 進(jìn)行 Encode,比如像拼出來(lái)的 http://unmi.cc?p1=%+&sd f&p2=中文,其中的中文、特殊符號(hào)&%和空格都必須進(jìn)行轉(zhuǎn)譯才能正確訪(fǎng)問(wèn)。
在 Java、.net 和 JS 中都有相應(yīng)的 encodeURL 方法可用,在 Objective-C 語(yǔ)言中,你可以試下
<pre>
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;
</pre>
來(lái)對(duì)完整的 URL(帶請(qǐng)求參數(shù)的)進(jìn)行編碼,比如執(zhí)行下面的代碼:
<pre>
NSString *url=@"http://unmi.cc?p1=%+&sd &p2=中文"; NSString encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
</pre>
上面代碼轉(zhuǎn)換出的 encodedValue 是:
http://unmi.cc?p1=%25+&sd%20&p2=%E4%B8%AD%E6%96%87
可見(jiàn),它不會(huì)轉(zhuǎn)換 URL 中的 ?%& 符號(hào),這也正常,因?yàn)樗隙ǚ植怀瞿膫€(gè) & 是參數(shù)的連接符號(hào)還是參數(shù)值,你可以單獨(dú)編碼參數(shù),然后在拼接成 URL 之前把屬性參數(shù)值中的 ?%& 等符號(hào)分別替換成相應(yīng)的編碼。
或者,您還可以試下另外一個(gè)方法來(lái)單獨(dú)編碼參數(shù)值,然后拼接成完整的 URL:
<pre>
/ newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, origString, NULL, NULL, kCFStringEncodingUTF8); */CF_EXPORTCFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaveUnescaped, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding);
本文原始鏈接 http://unmi.cc/objective-c-urlencode/, 來(lái)自 隔葉黃鶯 Unmi Blog
</pre>
參考代碼,分別編碼前面的 p1=%+&sd f&p2=中文,兩個(gè)參數(shù)的代碼和結(jié)果如下:
<pre>
NSString param = @"%+&sd f"; NSString encodedValue = (NSString)CFURLCreateStringByAddingPercentEscapes(nil, (CFStringRef)param, nil, (CFStringRef)@"!'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);
</pre>
這樣編碼出來(lái)的 encodedValue 為 %25%2B%26sd%20f,對(duì) ?%& 等符號(hào)也會(huì)編碼的。用上面的代碼對(duì) “中文” 進(jìn)行編碼的結(jié)果是:%E4%B8%AD%E6%96%87,與前面是一致的。
我實(shí)際應(yīng)用時(shí)還是這個(gè) CFURLCreateStringByAddingPercentEscapes 方法比較方便。
我們?cè)陧?xiàng)目中是使用的 ASIHTTPRequest 組件來(lái)訪(fǎng)問(wèn) URL 的,在使用
ASIFormDataRequest 時(shí)發(fā)出它其中有一個(gè)方法:
<pre> - (NSString)encodeURL:(NSString )string{ NSStringnewString=NSMakeCollectable([(NSString)CFURLCreateStringByAddingPercentEscapes( kCFAllocatorDefault, (CFStringRef)string, NULL, CFSTR(":/?#[]@!$ &'()*+,;="<>%{}|\^~`"), CFStringConvertNSStringEncodingToEncoding([self stringEncoding])) autorelease]); if (newString) { return newString;
} return @"";
}
</pre>
看起來(lái)它就是個(gè) Objective-C 版的 encodeURL 方法,可是它聲明成了一個(gè)實(shí)例方法,必須構(gòu)造出 ASIFormDataRequest 實(shí)例才能使用它,在它的父類(lèi) ASIHTTPRequest 中都無(wú)該方法?,F(xiàn)在來(lái)試驗(yàn)一下這個(gè)方法的返回值:
<pre>
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 提供的方式來(lái)進(jìn)行 URLEncode,把這個(gè)方法提出為一個(gè)工具方法即可。
</pre>