歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

iOS中URL的解碼和轉義問題

在iOS開發中,使用NSURLConnection去請求google places api時,如果請求的url中包含中文,則返回的結果為空,URL不能被google識別。

 NSString *_urlString = @"http://maps.googleapis.com/maps/api/geocode/json?address=南京&sensor=true";   
 NSURL *_url = [NSURL URLWithString:_dataString];
 NSMutableURLRequest *_request = [NSMutableURLRequest requestWithURL:_url];
 
我將url字符串轉碼一下,也不能識別。
 轉碼方法一:   
 NSString * _dataString = [[NSString alloc] initWithData:[_urlString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding];
 轉碼方法二:   
 NSString * _dataString=[NSString stringWithUTF8String:[_urlString UTF8String]];
 
這個問題其實是URL編碼和解碼問題。
 IPHONE下可以使用stringByAddingPercentEscapesUsingEncoding來編碼。   
 _urlString=[_urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 NSLog(@"Address URL: %@",_urlString);
 

但是,在實際使用中,編碼後的URL仍然可能會無效。因為URL的編碼方式並不唯一。參見:Encode-Compare 和 URLEncoding
 NSString* escapedURLString = [unescapedString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
 不同的編碼方式下,有些字符不會被編碼。
 
所以,客戶端使用什麼樣的編碼方式應該和服務器端的解碼方式配對。
 
可以使用CFURLCreateStringByAddingPercentEscapes編碼URL中參數部分後,再用前面stringByAddingPercentEscapesUsingEncoding編碼,應該可以適應多數解碼方式。
 
請求的URL中,還會有很多轉義符,也需要處理。
 
NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)yourtext, NULL, (CFStringRef)@”!*’();:@&=+$,/?%#[]“, kCFStringEncodingUTF8);
 
附上一些常用的轉義處理:
 
Javascript下:
 轉義字符: ‘\’
 $轉義為\$
 
XML下:
 & —-> \&
 < —-> &lt;
 > —-> &gt;
 ‘ —-> &apos;
 ” —-> &quot;
 
SQL下(MS Access):
 # —-> ##
 ! —-> !!
 ‘ —-> ”
 
在基於SOAP的HTTP服務請求時,經常需要將XML格式的請求信息轉義。

Copyright © Linux教程網 All Rights Reserved