前言:
A. 使用谓词校验某一字符是否符合对应正则表达式时,项目崩溃。多次检验后发现是字符串中的空格符异常。
B. 原本猜测是中文状态和英文状态下“空格符”的区别。再次实验的时候使用中文空格符、英文空格符均不可再现问题。只能复制那个“空格符”进行测试。
C. 虽然解决了这个BUG,也留下了更深的疑问。在简书中直接拷贝是测不到我所说BUG的,有兴趣的同学可以点这里获取资料。
BUG展示:
BUG检测出来的过程不在描述。最终测试结果:代码是正确的,字符串中的空格符异常,导致谓词方法报错。项目崩溃。
!!!复制代码是不会再现BUG的。这里获取资料
/* 判断字符串是否满足某一正则表达式
*
* @param str 需要判断的字符串
* @param regExp 正则表达式
*
* return
*/
+ (BOOL)string:(NSString *)str regExp:(WJStringRegExp)regExp
{
NSString *regExpStr = [self getRegExpStr:regExp]; // @"[0-9]*"
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regExpStr];
return [predicate evaluateWithObject:str];
}
2018-05-09 13:50:37.766700+0800 BUGTest[10571:228345] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "SELF MATCHES %@"'
奇葩之处:
有问题的字符串和常规手打的字符串作对比。两个看起来一样的字符串,我们通过- (BOOL)isEqualToString:(NSString*)aString;
方法来检验它们并不相等。将其通过UTF-8转码后可以明确的看出其不同之处。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event
{
NSString *str_0 = @"F S "; // 未知状态下
NSString *str_1 = @"F S "; // 英文状态下
if([str_0isEqualToString:str_1]) {
NSLog(@"是一样的啊!!!");
}
else
{
NSLog(@"是不一样的!!!");
NSLog(@"str_0 --- %@", [str_0 stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]);
NSLog(@"str_1 --- %@", [str_1 stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]);
}
}
2018-05-09 11:03:38.229807+0800 BUGTest[8507:124209] 是不一样的!!!
2018-05-09 11:03:38.230053+0800 BUGTest[8507:124209] str_0 --- F%C2%A0S%C2%A0
2018-05-09 11:03:38.230198+0800 BUGTest[8507:124209] str_1 --- F%20S%20
解决方法:
知道了问题,解决方法就很简单了,将字符串中奇葩的空格符手动替换掉。问题就解决了,项目正常输出,不会崩溃。(最好英文状态下输入)
疑问
UTF-8 转码成%C2%A0
的空格符不知道是怎样打出来的。求解。
网友评论