密碼中有特殊的字符IOS如何處理 IOS中URL包含中文參數的問題

由於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,感謝作者)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章