公司新上线的iOS APP账号注册是手机号码,前段时间有客户反应登录不上,相同的账号反复测试都能登录。昨天登录别人的账号时候直接从iPhone通讯录里复制粘贴了手机号码,登录失败,手动输入,登录成功。
一定是复制粘贴这里出问题了,打印log,账号密码看不出异常,NSString转换NSURL结果是null,怀疑手机号码复制的时候是Unicode引起的故障。
debug模式发现手机号 String.lengh :13,数来数去手机号明明是11位数啊,再往下一看,问题找到了,手机号头尾多了奇怪的东西。
搜了一些,网上找到有人遇到同样的问题,看这里,并提供了解决办法如下:
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方法因为,它没有副作用,仅仅是去掉我们想去掉的。
参考:
https://blog.csdn.net/lnking1992/article/details/80367924
网友评论