属性的 CNContact 编码

Posted

技术标签:

【中文标题】属性的 CNContact 编码【英文标题】:CNContact encoding of properties 【发布时间】:2017-09-18 20:14:33 【问题描述】:

我有一个名字为 André 的 v-card 字符串,我用 v-card 初始化了一个 CNContact

BEGIN:VCARD

VERSION:2.1

N:Foo;André;;;

FN:André Foo

TEL;CELL:00023 4474848

END:VCARD

我用这样的原始字符串初始化联系人:

if let data = string.data(using: .utf8) 
    do 
        let contacts = try CNContactVCardSerialization.contacts(with: data)
        let contact = contacts.first
        return contact

     catch 
        print("Data is not a VCard")
    

但是当我打印出contact.givenName 的原始字符串时,我得到:

André

如何在 ios 中获取正确的联系人框架字符串?

【问题讨论】:

【参考方案1】:

您需要在 vcard 字段中添加一个字符集,它默认为 ASCII。

BEGIN:VCARD

VERSION:2.1

N;CHARSET=UTF-8:Foo;André;;;

FN;CHARSET=UTF-8:André Foo

TEL;CELL:00023 4474848

END:VCARD

如果您想破解 vcard 中这种特定类型的错误,则可以手动将字符集注入其中:

let fixed = string.replacingOccurrences(of: "\nN:", with: "\nN;CHARSET=UTF-8:").replacingOccurrences(of: "\nFN:", with: "\nFN;CHARSET=UTF-8:")

【讨论】:

但是如果我不能控制字符集怎么办?假设我从第三方获得电子名片...... 那么第三方需要修复他们的电子名片。 这根本没用,抱歉。如果网络是这样的,我们现在都应该放弃...... 在某些情况下,由于硬件限制规则,这是不可能的(修复第三方)。例如,将 vCard 数据存储到 NDEF 记录中,写在 NFC 标签上。用凌乱的 CHARSET=UTF-8 子字符串填充每个字段太昂贵了。

以上是关于属性的 CNContact 编码的主要内容,如果未能解决你的问题,请参考以下文章

将 CNContact 转换为 NSData,反之亦然

Swift 3 / Xcode 8 - CNContact [访问] <私人>

实现对 CNContact 对象的所有值的搜索

如何在 CNContact swift 中检查联系人来源?

核心数据:在获取时重命名属性

使用字符串访问嵌套属性[重复]