前言:
A. 使用謂詞校驗(yàn)?zāi)骋蛔址欠穹蠈?yīng)正則表達(dá)式時(shí),項(xiàng)目崩潰。多次檢驗(yàn)后發(fā)現(xiàn)是字符串中的空格符異常佣耐。
B. 原本猜測是中文狀態(tài)和英文狀態(tài)下“空格符”的區(qū)別。再次實(shí)驗(yàn)的時(shí)候使用中文空格符采盒、英文空格符均不可再現(xiàn)問題旧乞。只能復(fù)制那個(gè)“空格符”進(jìn)行測試。
C. 雖然解決了這個(gè)BUG磅氨,也留下了更深的疑問尺栖。在簡書中直接拷貝是測不到我所說BUG的,有興趣的同學(xué)可以點(diǎn)這里獲取資料烦租。
BUG展示:
BUG檢測出來的過程不在描述延赌。最終測試結(jié)果:代碼是正確的除盏,字符串中的空格符異常,導(dǎo)致謂詞方法報(bào)錯(cuò)挫以。項(xiàng)目崩潰者蠕。
!F伞踱侣!復(fù)制代碼是不會(huì)再現(xiàn)BUG的。這里獲取資料
/* 判斷字符串是否滿足某一正則表達(dá)式
*
* @param str 需要判斷的字符串
* @param regExp 正則表達(dá)式
*
* 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 %@"'
奇葩之處:
有問題的字符串和常規(guī)手打的字符串作對比大磺。兩個(gè)看起來一樣的字符串抡句,我們通過- (BOOL)isEqualToString:(NSString*)aString;
方法來檢驗(yàn)它們并不相等。將其通過UTF-8轉(zhuǎn)碼后可以明確的看出其不同之處杠愧。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event
{
NSString *str_0 = @"F S "; // 未知狀態(tài)下
NSString *str_1 = @"F S "; // 英文狀態(tài)下
if([str_0isEqualToString:str_1]) {
NSLog(@"是一樣的按啤!A骷谩锐锣!");
}
else
{
NSLog(@"是不一樣的!O啤刺下!");
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
解決方法:
知道了問題,解決方法就很簡單了姨丈,將字符串中奇葩的空格符手動(dòng)替換掉畅卓。問題就解決了,項(xiàng)目正常輸出蟋恬,不會(huì)崩潰翁潘。(最好英文狀態(tài)下輸入)
疑問
UTF-8 轉(zhuǎn)碼成%C2%A0
的空格符不知道是怎樣打出來的。求解歼争。