由於url支持26個英文字母、數字和少數幾個特殊字符,因此,對於url中包含非標準url的字符時,就需要對其進行編碼。iOS中提供了函數stringByAddingPercentEscapesUsingEncoding對中文和一些特殊字符進行編碼,但是stringByAddingPercentEscapesUsingEncoding的功能並不完善,對一些較爲特殊的字符無效。
NSString中如果包括中文字符的話轉換爲NSURL得到的值爲nil,用stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding可以解決,代碼如下:
NSString *str = [NSString stringWithUTF8String:surl.c_str()];
str = @"http://218.21.213.10/MobileOA/TIFF/鄂安辦發45號關於下達2012年全市安全生產相對控制指標的通知1.jpg";
str = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *imageUrl = [NSURL URLWithString:str];
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]];
中間如果不加 str = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];這一行則imageUrl爲nil
比如請求"http://m.xxx.com/login.action?username=liyong&psw=&123&time=20120723"這樣的url請求時,其中的密碼部分因爲包含特殊字符“&123”,所以會被url認爲是分割參數的標誌,參數會被錯誤的分割如下:
username=liyong,psw=空,123=空,time=20120723
解決辦法:
因此,如果想正確的傳遞帶有特殊字符的密碼,需要對密碼做如下處理:
password = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef) password,NULL,(CFStringRef) @"!*'();:@&=+$,/?%#[]",kCFStringEncodingUTF8);
注意:這樣的encoding只能對params的內容,不要對整個url這樣做。
這個時候密碼就是“&123”了,因爲“&”被轉譯成了“&”,這樣就可以傳遞帶特殊字符的密碼了。
注:我用的是ASIHttpRequest。
我們對其進行封裝,提供一個完善的url編碼函數。
NSString* encodeURL(NSString* dString ){ NSString* escapedUrlString= (NSString*) CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef)dString, NULL,(CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 ); escapedUrlString = [escapedUrlString stringByAddingPercentEscapesUsingEncoding:kCFStringEncodingUTF8];
return [escapedUrlString autorelease]; }
需要特別注意的是encodeURL只能用來對url中的component編碼,不能用來對整個url進行編碼
(轉自:http://blog.csdn.net/catandrat111/article/details/8533817,感謝作者)