- 在iOS开发中有时候需要对特殊字符或汉字进行处理,尤其是在发送get请求时(post请求可以不处理),是不能传中文的,如果请求参数有
=
、&
肯定也是不行的,这时候就需要进行encode转码。
Foundation框架对特殊字符编码解码
- encode编码方法:
- iOS9之前使用
- (nullable NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc
,iOS9之后过期,但依然可以使用。 - iOS9之后使用
- (nullable NSString *)stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet *)allowedCharacters
,该方法在iOS7及以后才有效。
- iOS9之前使用
- decode方法:
- iOS9之前使用
- (nullable NSString *)stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)enc API_DEPRECATED
,iOS9之后过期. - iOS9之后使用
@property (nullable, readonly, copy) NSString *stringByRemovingPercentEncoding
,该方法在iOS7及以后才有效。
- iOS9之前使用
- 示例:
NSString * str = @"?!@#$^&%*+,:;='\”`<>()[]{}/\|中国 ";
//iOS9后过期
NSString * encodestr1 = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//支持iOS7及以后
NSString * encodestr2 = [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
//自己定义要转义的字符
NSString * encodestr3 = [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"?!@#$^&%*+,:;='\”`<>()[]{}/\|"].invertedSet];
//解码
NSString * decodestr1 = [encodestr1 stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString * decodestr2 = [encodestr2 stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString * decodestr3 = [encodestr3 stringByRemovingPercentEncoding];
打印结果
- 可见我们完全可以自己定义要转义的字符,这里需要说明的是
NSCharacterSet
其他类属性的所代表的特殊字符串:
URLFragmentAllowedCharacterSet @"#%<>[\]^`{|}"
URLHostAllowedCharacterSet @"#%/<>?@\^`{|}"
URLPasswordAllowedCharacterSet @"#%/:<>?@[\]^`{|}"
URLPathAllowedCharacterSet @"#%;<>?[\]^`{|}"
URLQueryAllowedCharacterSet @"#%<>[\]^`{|}"
URLUserAllowedCharacterSet @"#%/:<>?@[\]^`"
附加swift编码解码:
//去除中文及特殊字符
let str1 = "123中国¥&=美国"
//编码
let encodeStr = str1.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
print(encodeStr)
//解码
let decodeStr = encodeStr?.removingPercentEncoding;
CoreFoundation框架对特殊字符编码解码,C语言
- encode编码:
//避免出现重复编码出错问题(建议使用)
-(NSString *)URLEncodedString:(NSString *)str
{
NSString *encodedString = (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)str,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
return encodedString;
}
- decode解码
-(NSString *)URLDecodedString:(NSString *)str
{
NSString *decodedString=(__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)str, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
return decodedString;
}
- 示例:
//编码
NSString * encodestr4 = [self URLEncodedString:str];
//解码
NSString * decodestr4 = [self URLDecodedString:encodestr4];
NSString * decodestr5 = [self URLDecodedString:encodestr1];
NSString * decodestr6 = [self URLDecodedString:encodestr2];
NSString * decodestr7 = [self URLDecodedString:encodestr3]
打印结果:
- Demo下载:iOS对特殊字符的编码解码