---轉(zhuǎn)自 博客園 歉信君
iOS中URL的解碼和轉(zhuǎn)義問(wèn)題
在iOS開(kāi)發(fā)中嘲玫,使用NSURLConnection去請(qǐng)求google places api時(shí),如果請(qǐng)求的url中包含中文劳曹,則返回的結(jié)果為空,URL不能被google識(shí)別。
NSString *_urlString = @"http://maps.googleapis.com/maps/api/geocode/json?address=南京&sensor=true";
NSURL *_url = [NSURL URLWithString:_dataString];
NSMutableURLRequest *_request = [NSMutableURLRequest requestWithURL:_url];
我將url字符串轉(zhuǎn)碼一下遭居,也不能識(shí)別。
轉(zhuǎn)碼方法一:
NSString * _dataString = [[NSString alloc] initWithData:[_urlString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding];
轉(zhuǎn)碼方法二:
NSString * _dataString=[NSString stringWithUTF8String:[_urlString UTF8String]];
這個(gè)問(wèn)題其實(shí)是URL編碼和解碼問(wèn)題旬渠。
IPHONE下可以使用stringByAddingPercentEscapesUsingEncoding來(lái)編碼俱萍。
_urlString=[_urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Address URL: %@",_urlString);
但是,在實(shí)際使用中告丢,編碼后的URL仍然可能會(huì)無(wú)效枪蘑。因?yàn)閁RL的編碼方式并不唯一。參見(jiàn):Encode-Compare 和 URLEncoding
NSString* escapedURLString = [unescapedString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
不同的編碼方式下岖免,有些字符不會(huì)被編碼岳颇。
所以,客戶端使用什么樣的編碼方式應(yīng)該和服務(wù)器端的解碼方式配對(duì)颅湘。
可以使用CFURLCreateStringByAddingPercentEscapes編碼URL中參數(shù)部分后话侧,再用前面stringByAddingPercentEscapesUsingEncoding編碼,應(yīng)該可以適應(yīng)多數(shù)解碼方式闯参。
請(qǐng)求的URL中瞻鹏,還會(huì)有很多轉(zhuǎn)義符,也需要處理鹿寨。
NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)yourtext, NULL, (CFStringRef)@”!*’();:@&=+$,/?%#[]“, kCFStringEncodingUTF8);
附上一些常用的轉(zhuǎn)義處理:
Javascript下:
轉(zhuǎn)義字符: ‘\’
$轉(zhuǎn)義為\$
XML下:
& —-> \&
< —-> <
> —-> >
‘ —-> '
” —-> "
SQL下(MS Access):
# —-> ##
! —-> !!
‘ —-> ”
在基于SOAP的HTTP服務(wù)請(qǐng)求時(shí)新博,經(jīng)常需要將XML格式的請(qǐng)求信息轉(zhuǎn)義。