今天在看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));
iOS9.0之后就推荐使用stringByAddingPercentEncodingWithAllowedCharacters
NSString *value = @"<url>";
value = [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSCharacterSet对象又是什么呢
NSCharacterSet ,以及它的可变版本NSMutableCharacterSet,用面向对象的方式来表示一组Unicode字符。它经常与NSString及NSScanner组合起来使用,在不同的字符上做过滤、删除或者分割操作。为了给你提供这些字符是哪些字符的直观印象
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