CFURLCreateStringByAddingPercentEscapes與CFURLCreateStringByReplacingPercentEscapesUsingEncoding


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");
NSString *b = @"b";

CFSTR是一個宏,這個宏的定義可能是CFStringMakeConstantString,也可能是__builtin___CFStringMakeCo-

nstantString。如果是CFStringMakeConstantString,看看CFStringMakeConstantString的實現就會明白,

CFSTR("a")是存放在一個全局字典里面的,下次用到CFSTR("a")的時候先查字典里面有沒有,如果有就是用存

在的,如果沒有則分配一個,並且放到字典里面。

所以這里有兩個需要注意的,一:CFSTR分配出來的字符串對象是不能自己釋放的,如果你釋放了下次在使用就

會使用到一個野對象;二:多線程使用可能會出問題,因為全局的字典是沒有鎖的。

而NSString的@有些不一樣,應該和__builtin___CFStringMakeConstantString有些類似,允許你多線程使用,

同樣也不需要你自己去release,可以理解為b是一個autorelease的對象,系統會自己自動收回b。如果想長時間持

有b那就retain,但不要忘了release。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM