iOS 7联系人号码空格不是空格[重复]

Posted

技术标签:

【中文标题】iOS 7联系人号码空格不是空格[重复]【英文标题】:iOS 7 contact number spaces are not spaces [duplicate] 【发布时间】:2013-11-02 16:06:48 【问题描述】:

在我的应用程序中,我正在尝试检索联系人号码列表并尝试对其进行操作。我意识到,每当我添加新联系人(更新到 ios 7 后)时,新联系人的格式都会发生变化,因为新添加的数字中有空格。

使用普通替换方法不会删除空格。

这些真的是空间还是这些是什么?我的目标是取回“空间”免费号码。

比如号码是1 818 323 323 323,我想得到1818323323323

【问题讨论】:

什么是“普通替换方法”? @mrueg 可能是标准的 NSString stringByReplacing* 方法 【参考方案1】:

我认为这并没有摆脱“空格”,而是留下了只有个十进制字符。这段代码为我做到了:

phoneNumberString = [[phoneNumberString componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];

这会删除不是数字 0-9 的所有内容

Swift 4.1:

phoneNumberString = phoneNumberString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")

【讨论】:

太棒了,这对我有用,但是如果您有兴趣保留加号,这将删除数字中的 +,您需要对其应用一些逻辑。 太棒了!这就像一个魅力。非常感谢你:D【参考方案2】:

试试这个:

NSString *cleaned = [[phoneNr componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""];

这应该适用于任何类型的空间 (of which there are many)。可能看起来有些低效,但对于电话号码,这应该没问题。

【讨论】:

在尝试替换 @" " @" "(alt-space) 和 @"\u00a0" 后,我几乎可以肯定这种方法会起作用,但这种方法对我不起作用 为我解决了与通讯簿电话号码有关的 \U00a0 问题 要让它在我的 Localizable.strings 文件中工作,我必须使用全部大写:\U00A0【参考方案3】:

某些 iOS7 电话号码使用不间断空格进行编码。试试这个:

        NSString* stringFormatted = [phoneNumber stringByReplacingOccurrencesOfString:@"\u00a0" withString:@""];

【讨论】:

对我不起作用:[【参考方案4】:

经过太多的字符串清理,我在直接从通讯簿打印 CFStringRef 后终于找到了答案。以下是幕后发生的事情...

    在 iOS7 中添加联系人,Apple 将其存储为:(555).555-5555(其中 . 实际上是 U00A0 或 &nbsp) 我的应用程序从 AddressBook 复制联系人信息到 CFStringRef 中(当 NSLogged 显示 . 时) CFStringRef 被转换为 NSString(NSLog 现在显示 555\U00a0555-5555)

要删除 \U00A0 我尝试了 3 个来自该线程的答案和 [NSCharacterSet characterSetWithRange:(160,1)] 没有工作。最终起作用的是这行代码:

phoneNumber = [phoneNumber stringByReplacingOccurrencesOfString:@"." withString:@""];

// 其中@"."是通过键入 Option+空格键创建的

【讨论】:

这种方式不适合我【参考方案5】:

另一个(非常灵活的)选项是使用正则表达式。这允许您保留 + 或您想要保留的任何其他字符。

let numberFromAddressBook = "+1 818 323 323 323"

let cleanNumber = numberFromAddressBook.stringByReplacingOccurrencesOfString("[^0-9+]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range:nil)

"+1818323323323"

【讨论】:

【参考方案6】:

我在应用中使用的最简洁的解决方案是:

NSMutableCharacterSet *phoneNubmerCharacterSet = [NSMutableCharacterSet characterSetWithCharactersInString:@"+"];
[phoneNubmerCharacterSet formUnionWithCharacterSet:[NSCharacterSet decimalDigitCharacterSet]];
NSString* phoneString = [[phoneString componentsSeparatedByCharactersInSet:[phoneNubmerCharacterSet invertedSet]] componentsJoinedByString:@""];

没有“if”逻辑,保持+号,删除所有类型的随机不需要的字符

【讨论】:

这非常有效,因为可能有很多不需要的字符,如 \u0000 等。【参考方案7】:

我对发帖人的回答做了一个小的调整,以防有人想在数字的开头保留 +。

如果你想在删除空格后保留加号,我做了这个小调整。

 Boolean shouldAddPlus = NO;

 if([[phoneNumber substringToIndex:1] isEqualToString:@"+"])
    
        shouldAddPlus = YES;
    

 phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];

 if(shouldAddPlus)
    phoneNumber = [base stringByAppendingString:phoneNumber];

【讨论】:

【参考方案8】:

正确的解决办法是用有效的空格替换出现的地方

NSString *clean = [dirty stringByReplacingOccurrencesOfString:@"\u00a0" withString:@" "];

这样您就不会失去空间,并且用户可以看到其他应用程序中看到的内容。

【讨论】:

以上是关于iOS 7联系人号码空格不是空格[重复]的主要内容,如果未能解决你的问题,请参考以下文章

iOS 通讯录空格

如何删除vcf文件中的重复联系人

Phonegap 联系人。更新联系人时保存重复的电话号码

如何在 iOS 中选择联系人电话号码?

根据电话号码添加原始联系人时联系人重复

iOS 7 Addressbook 和 NSMutableArray 与 UITableView 获取名称和号码