属性的 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 编码的主要内容,如果未能解决你的问题,请参考以下文章