IOS 11 通讯录手机号「隐形字符」Bug的处理

针对用户使用含有隐藏字符的手机号登录导致的问题,本文详细解析了问题产生的原因,并提供了一种有效的解决方案,即通过数字提取来过滤苹果通讯录自带的隐藏字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开篇是这样的,由于一个客户使用手机号登录的时候复制了手机通讯录里面的号码,导致登录失败,服务器识别不出用户的登录手机号,操作如下:

复制出来的通讯录查了一下格式就会发现「130 5755 xxxx」的长度是15见下图(盗来的)
我们再来看下 URI 编码结果:「%E2%80%AD130%205755%207808%E2%80%AC」,有没有发现问题? %E2%80%AD, %E2%80%AC是什么鬼?

我们知道,通过 encodeURIComponent 可把字符串作为 URI 组件进行编码,但不会对 ASCII 的字母、数字和- _ . ! ~ * ' ( ) 这些特殊的字符进行编码,其余的全部使用十六进制编码表示,如空格将被转换为 %20,但 %E2%80%AD 和 %E2%80%AC 是从什么转换过来的就有意思了,一个「看不见」且「不占空间」的字符!

以上内容部分出处来自:https://github.com/zwwill/blog/issues/12

具体解决思路就是通过比对0~9重新组装一个字符串出来,代码如下:

/// 过滤苹果通讯录自带的隐藏字符,使用数字提取获得号码
+ (NSString *)FiltrationPhoneNumberHideStr:(NSString *)phoneNumber; {
    NSString *str = [[NSString alloc] init];
    NSArray *Numbers = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"0"];
    for (int i = 0; i<phoneNumber.length; i++) {
        NSString *character = [phoneNumber substringWithRange:NSMakeRange(i, 1)];
        for (NSString *number in Numbers) {
            if ([character isEqualToString:number]) {
                str = [str stringByAppendingString:character];
            }
        }
    }
    return str;
}
复制代码

如果有什么错漏或者表述不清楚欢迎留言!

转载于:https://juejin.im/post/5a52dc14518825733e604a28

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值