iOS之特殊字符转义

1,267 阅读1分钟

今天在看APP内部小程序SDK的代码时发现一个问题,因为我们活动都是由小程序来写,经常有商户给到一些奇奇怪怪的网址,例如里面有什么{VID},小程序回到原生加载WebView,发现我们并没有对URL进行CFBridgingRelease

     NSString *res = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(<#CFAllocatorRef allocator#>, <#CFStringRef originalString#>, <#CFStringRef charactersToLeaveUnescaped#>, <#CFStringRef legalURLCharactersToBeEscaped#>, <#CFStringEncoding encoding#>))
     第一个参数:kCFAllocatorDefault
     第二个参数:待转码的字符串
     第三个参数:指示确定不转义的字符
     第四个参数:指示确定要转义的字符
     第五个参数:编码类型 
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)(loadUrl), (CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]", NULL, kCFStringEncodingUTF8));

image.png

iOS9.0之后就推荐使用stringByAddingPercentEncodingWithAllowedCharacters

NSString *value = @"<url>"; 
value = [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

NSCharacterSet对象又是什么呢

NSCharacterSet ,以及它的可变版本NSMutableCharacterSet,用面向对象的方式来表示一组Unicode字符。它经常与NSStringNSScanner组合起来使用,在不同的字符上做过滤、删除或者分割操作。为了给你提供这些字符是哪些字符的直观印象

URLFragmentAllowedCharacterSet  "#%<>[]^`{|}

URLHostAllowedCharacterSet      "#%/<>?@^`{|}

URLPasswordAllowedCharacterSet  "#%/:<>?@[]^`{|}

URLPathAllowedCharacterSet      "#%;<>?[]^`{|}

URLQueryAllowedCharacterSet    "#%<>[]^`{|}

URLUserAllowedCharacterSet      "#%/:<>?@[]^`

NSString * kNumber =@"0123456789.";

NSCharacterSet *numberSet = [[NSCharacterSetcharacterSetWithCharactersInString:kNumber]invertedSet];

invertedSet在这里是有什么用呢?

  • invertedSet方法是去反字符,把所有的除了kNumber里的字符都找出来(包含去空格功能)
    NSString *string    = @"     123,45_6  7/8>9a     ";

    NSString * kNumber  = @"01234";

    NSCharacterSet *numberSet = [NSCharacterSet characterSetWithCharactersInString:kNumber];
    
    NSCharacterSet *numberSet1 = [[NSCharacterSet characterSetWithCharactersInString:kNumber]invertedSet];
    NSString * str =  [string stringByTrimmingCharactersInSet:numberSet];
    NSString * str1 =  [string stringByTrimmingCharactersInSet:numberSet1];
    NSLog(@"str == %@  ||  str1 == %@ ",str,str1);
打印结果为
str  ==      123,45_6  7/8>9a        
str1 == 123,4