在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下:
& —-> \&
< —-> <
> —-> >
‘ —-> '
” —-> "
SQL下(MS Access):
# —-> ##
! —-> !!
‘ —-> ”
在基於SOAP的HTTP服務請求時,經常需要將XML格式的請求信息轉義。