最近项目线上问题,造成问题的原因:
应用的用户信息界面需要输入手机号码,该用户就把自己电话簿里的手机号码进行复制(copy)之后,把复制的内容粘贴在我们页面的输入框里,一切都很完美,但点用户击保存后,却显示弹框“请输入正确的手机号”,于是用户就立马截图帮助(投诉了)我们改进bug,还加了句每次必现。
分析原因:
从用户的截图的显示界面看,输入框里的手机号码完全没有问题,我还打通了。那会是什么原因造成的呢?
1.根据用户的描述他是从iphone自带的电话薄里copy了手机号码,然后粘贴在我们的输入框里,遇到了问题,而且每次必现。
真是厉害了(连自己手机号码都要复制粘贴)。
2.既然问题来了,就根据用户的描述在模拟器上进行了复盘,果然出现了。
3.但是从界面上完全没有问题啊,为啥不对呢?难道复制的粘贴后的内容有啥问题,打断点瞧下,果不其然,文本框复制的文本和普通的字符串有区别。
我们复制的电话号码 @"(415)555-3695",长度明明是14,但我打印出来的长度为16。
通过断点发现
我们电话簿里复制的电话号码(415)555-369前后分贝多了\u0000202d和\u0000202c。
这两个\u的是什么东西。难道所有复制粘贴的文本都会带这两个东西?后经过测试发现只有通过复制电话簿里的电话号码才会有这两个奇怪的东西。(难道是苹果的bug)
不管了,既然问题出了,就只能解决了。
解决方案:
1.既然有这两个奇怪的东西,那就把这个去掉。首先知道这两个东西是啥?(找了资料说这个属于不显示的unicode码所以可以看到界面上显示时正常的但位数就不对)。
2.如何去掉
a.字符替换(发现@"\\p{Cf}"属于不显示的uicode的一个总称:\p{Cf} or \p{Format}: invisible formatting indicator.)
[str stringByReplacingOccurrencesOfString:@"\\p{Cf}" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, str.length)];
b.过滤(运用类似正则的东西)
NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
NSCharacterSet *specCharacterSet = [characterSet invertedSet];
NSArray *strArr = [str componentsSeparatedByCharactersInSet:specCharacterSet];
return [strArr componentsJoinedByString:@""];
总结分析:
上面两个方法都可以解决上面的问题,但说下方法a就是仅仅针对不可见的unicode进行替换。
方法b的话只会显示[0-9]之间的数字,其它的字符也会过滤掉。
上面两个方法,我比较推崇a方法因为,它没有副作用,仅仅是去掉我们想去掉的。
关于不可见的unicode的了解,可以了解下。