在iOS中,访问一些HTTP/HTTPS请求时,如果url中存在中文或者特殊字符,会导致无法正常的访问到资源或服务,例如加号会变成空格,想要解决这个问题,需要对url进行编码。
下面方法中用到的 @"!*'();:@&;=+$,/?%#[] " ,用户可自定义,代表的意思是需要对这些特殊字符进行转码。
方法一 ios(2.0,9.0)
//URLEncode - (NSString *)URLEncode{ // CharactersToBeEscaped = @":/?&=;+!@#$()~',*"; // CharactersToLeaveUnescaped = @"[]."; NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)self, NULL, CFSTR("!*'();:@&;=+$,/?%#[] "), kCFStringEncodingUTF8)); return [result stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; }
//URLDEcode - (NSString *)URLDecode{ NSMutableString *outputStr = [NSMutableString stringWithString:self]; [outputStr replaceOccurrencesOfString:@"+" withString:@" " options:NSLiteralSearch range:NSMakeRange(0,[outputStr length])]; return [outputStr stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; }
//URLDEcode - (NSString *)URLDecode{ NSString *decodedString = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)encodedString, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); return decodedString; }
方法二 ios(7.0)
//URLEncode - (NSString *)URLEncode{ NSString *encodedUrl = [self stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; return encodedUrl; }
NSCharacterSet`系统内置的一些返回CharacterSet 的方法
- URLFragmentAllowedCharacterSet "#%<>[\]^`{|} - URLHostAllowedCharacterSet "#%/<>?@\^`{|} - URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|} - URLPathAllowedCharacterSet "#%;<>?[\]^`{|} - URLQueryAllowedCharacterSet "#%<>[\]^`{|} - URLUserAllowedCharacterSet "#%/:<>?@[\]^` 意思是这些字符需要按照URL的规则被以%开头的编码替换,如果某个字符不想被替换,则不要写在""之间即可。
//URLDEcode
- (NSString *)URLDecode{
return [self stringByRemovingPercentEncoding];
}
方法三 ios(7.0)
//URLEncode - (NSString *)URLEncode{ NSString *charactersToEscape = @"!*'();:@&;=+$,/?%#[] "; NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet]; NSString *encodedUrl = [self stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters]; return encodedUrl; }
//URLDEcode - (NSString *)URLDecode{ return [self stringByRemovingPercentEncoding]; }