iOS中訪問HTTP資源需要對URL進行Encode才能正確訪問。
OC中有方法:
- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc;
例如:
NSString *url=@"http://unmi.cc?p1=%+&sd &p2=中文";
NSString *encodedValue = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
結果是:
http://unmi.cc?p1=%25+&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);
|
CoreFoundation里面的CFStringRef和NSString*是可以直接轉換的,兩種也都有一個相似的用來直接賦常量的操 作。例如: CFStringRef a = CFSTR("a"); CFSTR是一個宏,這個宏的定義可能是CFStringMakeConstantString,也可能是__builtin___CFStringMakeCo- nstantString。如果是CFStringMakeConstantString,看看CFStringMakeConstantString的實現就會明白, CFSTR("a")是存放在一個全局字典里面的,下次用到CFSTR("a")的時候先查字典里面有沒有,如果有就是用存 在的,如果沒有則分配一個,並且放到字典里面。 所以這里有兩個需要注意的,一:CFSTR分配出來的字符串對象是不能自己釋放的,如果你釋放了下次在使用就 會使用到一個野對象;二:多線程使用可能會出問題,因為全局的字典是沒有鎖的。 而NSString的@有些不一樣,應該和__builtin___CFStringMakeConstantString有些類似,允許你多線程使用, 同樣也不需要你自己去release,可以理解為b是一個autorelease的對象,系統會自己自動收回b。如果想長時間持 有b那就retain,但不要忘了release。 |
