原文方式1链接:https://blog.csdn.net/aaaaazq/article/details/80761167
原文方式2链接:https://www.jianshu.com/p/ee0c49ac836f
方法1:
URL编码是一种常见的编码方式,作用不多说,直接上代码。URL编码:
- (NSString *)URLEncodedString
{
// CharactersToBeEscaped = @":/?&=;+!@#$()~',*";
// CharactersToLeaveUnescaped = @"[].";
NSString *unencodedString = self;
NSString *encodedString = (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
return encodedString;
}
URL解码:
- (NSString *)URLDecodedString
{
NSString *result = [(NSString *)self stringByReplacingOccurrencesOfString:@"+" withString:@" "];
return [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
建议这两个方法放在NSString的分类中,并且声明为实例方法,这样可以直接用NSString的对象去调用。
- 调用示例:
NSString * string = @"zhansan啦啦啦啦1234567";
NSString * urlEncode = [string URLEncodedString];
NSString * urlDecode = [string URLDecodedString];
NSLog(@"urlEncode == %@",urlEncode);
NSLog(@"urlDecode == %@",urlDecode);
打印结果:
urlEncode == zhansan%E5%95%A6%E5%95%A6%E5%95%A6%E5%95%A61234567
urlDecode == zhansan啦啦啦啦1234567
方法2:
使用Foundation框架中的stringByAddingPercentEncodingWithAllowedCharacters方法对url进行编码(适用于iOS9之后)。通过传入一个NSCharacterSet字符集对象决定对哪些字符进行编码,所有字符集对象中的字符都会被编码。系统提供了一些包装好的字符集对象,也可以自定义需要编码的字符集对象。
NSString *encodeUrlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; //编码
NSString *decodeUrlString = [encodeUrlString stringByRemovingPercentEncoding]; //解码
NSLog(@"编码后的URL:%@",encodeUrlString);
NSLog(@"解码后的URL:%@",decodeUrlString);
打印结果:
各种系统包装好的编码字符集包含的字符范围:
URLFragmentAllowedCharacterSet “#%<>[]^`{|}
URLHostAllowedCharacterSet “#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet “#%/:<>?@[]^`{|}
URLPathAllowedCharacterSet “#%;<>?[]^`{|}
URLQueryAllowedCharacterSet “#%<>[]^`{|}
URLUserAllowedCharacterSet “#%/:<>?@[]^`
在实际使用过程中 , 方式1 , 可以对 冒号 , 逗号 进行很好的编码 , 可惜这个已经不推荐了 , 用了会有系统警告 , 而方法2 , 用系统的set是没有处理 冒号 和 逗号, 方式2可以使用自定义的set , 推荐使用.
// 这个和方法1的返回一样,可以处理冒号和逗号
NSString *encodedString = [unencodedString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@""]];