背景
场景一:有技术支持过来,说用户登录不上,报错原因是不存在该用户,但是明明已经注册过了。
过程:登陆的请求参数确实有收到,用户名是手机号。用户id也是存在的,根据用户id查出来的手机号,确实和登陆名是一样的,但是为啥会报用户不存在的错误呀?
开始根本没有想过用手机号进行查询,后来实在是没有排查到别的原因,突然想到之前遇到的手机号前后有空格的问题。length了一下,果然,长度为17。
告知业务人员,在编辑用户手机号的地方,将前后空格去掉,然后再保存一次,试了好几次之后,长度还是17,业务人员很确定,没有空格。我用concat前后连接字符观察后,也确实没有空格。后来我告知业务,让她把手机号全删除,手动输入一次再保存,然后OK,问题解决。
问题虽然解决了,但是目前为止,我仍然不明白什么原因。好奇的我就向经验丰富的同事,描述了一下问题现象。果然,有厉害的小伙伴就是好,他说之前遇到过这种问题,有不可见字符。让我拿着数据库中那个字符串,unicode转码一下,果然后面多了点东西\u202c,第一次知道了还有不可见字符
场景二:邀评之后,客人的回访,短信平台有回访记录,也有回调我所负责系统的日志,但是数据没有落库
**过程:**有了场景一的经验,length了一下,长度为17,以为还是不可见字符,用concat拼接字符打印了一下,其实不是,unicode编码了一下,手机号前面多了一位\u0009。
业务人员问不是11位为啥手机号邀评能发出去呀,我也好奇,看了一下代码,发送邀评前是有手机号位数校验,校验的代码为phone.trim().length()!=11
,所以最终判断的手机号长度还是11位
解决方案
1、string.replaceAll("\\p{C}", "") // 该方法是将不可见字符串用空字符替换
2、string.trim() // 该方法是去掉字符串收尾的空格
在手机号落库前先进行以上处理