iOS开发中(OC/Swift)特殊字符串编码解码

  • 在iOS开发中有时候需要对特殊字符或汉字进行处理,尤其是在发送get请求时(post请求可以不处理),是不能传中文的,如果请求参数有=&肯定也是不行的,这时候就需要进行encode转码。

Foundation框架对特殊字符编码解码

  • encode编码方法:
    1. iOS9之前使用- (nullable NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)enc,iOS9之后过期,但依然可以使用。
    2. iOS9之后使用- (nullable NSString *)stringByAddingPercentEncodingWithAllowedCharacters:(NSCharacterSet *)allowedCharacters,该方法在iOS7及以后才有效。
  • decode方法:
    1. iOS9之前使用- (nullable NSString *)stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)enc API_DEPRECATED,iOS9之后过期.
    2. iOS9之后使用@property (nullable, readonly, copy) NSString *stringByRemovingPercentEncoding,该方法在iOS7及以后才有效。
  • 示例:
    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];

打印结果
Foundation框架中对特殊字符编码解码示例结果

  • 可见我们完全可以自己定义要转义的字符,这里需要说明的是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]

打印结果:
 CoreFoundation框架对特殊字符编码解码示例结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值