我正在编写一个应用程序,该应用程序从内部客户数据库生成 vCard,并希望在卡中包含其他信息,例如内部客户编号。在阅读 RFC 时,我看到了“供应商特定”扩展,这些扩展将在 IANA 等处注册。这些扩展是正确的选择吗?使用时应该注意什么,有什么陷阱吗?是否有其他方法可以在 vCard 中定义自定义字段?
RFC 2426 第 4 节 指定如何创建非标准名称。如果您阅读产生式规则,您将了解定义属性的确切方式。例如,要定义客户编号,您可以在单独的行上简单地说
X-CUSTOMER-ID:123
。
注意事项:
只是为了给另一个历史答案提供另一个 vCard 4.0 (RFC 6350) 附录:第 6.10 节。扩展属性和参数指定:
本文档定义的属性和参数可以是
延长。 非标准、私有属性和参数带有
以“”开头的名称可以在两个X-
之间双边定义 未经外部注册或标准化的合作代理商。
而且,NBF 部分的评论进一步强调:
x-name = "x-" 1*(ALPHA / DIGIT / "-") ; Names that begin with "x-" or "X-" are ; reserved for experimental use, not intended for released ; products, or for use in bilateral agreements.
尽管如此,行业实践的发展速度当然比标准化更快。有关一些已用
X-
字段的 2017 年快照,请参阅这个简单的 vcard-generator:
X-MAIDENNAME:MaidenName X-PHONETIC-FIRST-NAME:PhoneticFirstName X-PHONETIC-MIDDLE-NAME:PhoneticMiddleName X-PHONETIC-LAST-NAME:PhoneticLastName X-PRONUNCIATION-FIRST-NAME:PronunciationFirstName X-PRONUNCIATION-MIDDLE-NAME:PronunciationMiddleName X-PRONUNCIATION-LAST-NAME:PronunciationLastName [...] X-SOCIALPROFILE;PREF=1;TYPE=facebook:http://www.facebook.com/johndoe X-SOCIALPROFILE;PREF=2;TYPE=twitter;x-user=johnie:x-apple:johnie
此存储库还有助于实现属性值转义规则 (3.4.)。粗略引用来自 src/util.js:
const encodeText = (text) => (
text ?
text
.replace(/\\/g, '\\\\')
.replace(/\r?\n/g, '\\n')
.replace(/,/g, '\\,')
.replace(/;/g, '\\;') :
''
);