歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> iOS中URL的解碼和轉義問題

iOS中URL的解碼和轉義問題

日期:2017/3/1 10:00:02   编辑:Linux編程

在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