unicode码\u202c\u202d

公司新上线的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

http://www.fileformat.info/info/unicode/char/202c/index.htm

http://www.fileformat.info/info/unicode/char/202d/index.htm

你可能感兴趣的:(unicode码\u202c\u202d)