一、 vCard简介
vCard是电子商务名片(The Electronic Business Card)的一种简称,它定义了一种个人信息的组织方法,统一了个人信息的表示方法,为个人信息交换(PDI:Personal Data Interchange)提供了一种有效的工具,也可说是一种信息交换的媒介,主要用于个人信息的传输和交换。vCard主要应用于个人信息管理系统(PIM:Personal Information Manager),并且成为了PIM标准的一个组成部分,当前vCard版本有V2.1和V3.0两种,但现在主要应用的是V2.1版本,本文要分析的也是V2.1版本的内容。
二、 vCard数据包的组织形式:
形式一:基本形式
<BEGIN:VCARD>
<VERSION:2.1>
[PropertyName[‘;’PropertyParmeters]’:’PropertyValue]
<END:VCARD>
形式二:含多个vCard基本包的分组形式
<BEGIN:VCARD>
<VERSION:2.1>
<BEGIN:VCARD>
[PropertyName[‘;’PropertyParmeters]’:’PropertyValue]
<END:VCARD>
<BEGIN:VCARD>
[PropertyName[‘;’PropertyParmeters]’:’PropertyValue]
<END:VCARD>
<END:VCARD>
形式三:对字段名进行分组的分组形式:
<BEGIN:VCARD>
<VERSION:2.1>
[<char string>‘.’PropertyName[‘;’PropertyParmeters]’:’PropertyValue]
<END:VCARD>
形式四:在字段值中嵌套vCard基本包的分组形式:
<BEGIN:VCARD>
<VERSION:2.1>
[PropertyName[‘;’PropertyParmeters]’:’PropertyValue]
<PropertyName[‘;’PropertyParmeters]’:’>
<BEGIN:VCARD>
[PropertyName[‘;’PropertyParmeters]’:’PropertyValue]
<END:VCARD>
. . . . . .
<END:VCARD>
这种形式当前只出现在“AGENT”字段值中。
三、 vCard属性(Property)的组织
1、
基本格式:[PropertyName[‘;’PropertyParmeters]’:’PropertyValue]
2、
字段名(PropertyName):
对于字段名有两种形式,一种是单纯的字段名,另一种是在字段名前加一个字符分组名的前缀(见第二点的形式三定义)。
在vCard2.1中定义了如下24种字段名:FN、N、PHOTO、BDAY、ADR、LABAL、TEL、EMAIL、MAILER、TZ、GEO、TITLE、ROLE、LOGO、 AGENT、ORG、NOTE、REV、SOUND、URL、UID、VERSION、KEY、X- <任意名>,对于这些字段名除了“VERSION”、“N”外(有些系统可能没有“N”、“VERSION”字段),其余字段都是可选的,其中“X- <任意名>”是扩展字段名,对于字段名字符都是大写形式(有些系统可能会有小写形式)。
3、
字段参数(PropertyParmeters):
1)、参数类型分六种:字段类型(TYPE)、字段值类型(VALUE)、编码类型(ENCODING)、字符集类型(CHARSET)、语言类型(LANGUAGE)、X- <任意名>。
这六种类型在数据包中不分先后次序,并且都是可选的,参数类型名可有可无,可以只有参数值而无参数类型名,也可以有带参数类型名的参数类型值,其中参数类型名和参数值之间用“=”隔开。
每种参数类型之间应当用“;”隔开,其中字段类型(TYPE)可以定义多个参数值,每个参数值之间当是在“=”后面时用“,”分开,否则用“;”分开,参数值中有“;. , : \”字符时必须加上转义字符“\”,参数值也可以有自定义的扩展参数值,扩展参数值一样用“X- <任意名>”表示。
编码类型包含四种:7BIT、BASE64、QUOTED-PRINTABLE、8BIT,默认编码类型为7BIT,主要用于在网络传输过程中对数据的完整性保护,常用的编码类型是BASE64和QUOTED-PRINTABLE。
4、
字段值(PropertyValue):
字段值紧跟参数值的“:”后面,字段值以“\r\n”来结束其内容,在字段值中可以用多行(folding)来表示,但在从vCard数据包中取出值时必须去除换行换行标志符(unfolding)。
根据不同编码对字段值进行分行的方法有:
1)、对于非QP和非BASE64编码,在原始字段值中当有出现空格时则可以在空格前用“\r\n”进行分行,“\r\n”后至少要有一个空格符;
2)、对于QP编码,在要分行的行尾添加上“=”紧接用“\r\n”来分行,对于QP编码每行长度不得超过76个字符(包含最后的“=”,但不包含“\r\n”的长度),超过76个字符时则要进行分行。
3)、对于BASE64编码,可直接用“\r\n”来分行,每行长度也不得超过76个字符(不包含“\r\n”的长度),超过76个字符时则要进行分行。
1)、对于非QP和非BASE64编码,在字段值内,若发现有“\r\n”且后面紧跟有“空格”符,则应去除掉“\r\n”。
2)、对于QP编码,在字段值内,若发现有“=\r\n”,则应去除“=\r\n”。
3)、对于BASE64编码,在字段值内,若发现有“\r\n”,则应去除“\r\n”。
根据不同编码判断字段值结束位置:
1)、对于非QP和非BASE64编码,若发现有“\r\n”且后面没有紧跟“空格”符,则表示字段结束。
2)、对于QP编码,在字段值内,若发现有“\r\n”,且“\r\n”前没有“=” 则表示字段结束。
3)、对于BASE64编码,在字 段值内,若发现有“\r\n”, 且“\r\n”前有“=”或“==”,则表示字段结束,若发现有“\r\n”且“\r\n”前没有有“=”或“==”,这时应判断这里的“\r\n”与后一个“\r\n”之间是否包含有 “:”,若有则表示字段结束。
三
、vCard2.1定义的各种字段
字段名
|
字段类型
|
字段值
|
备注
|
FN
|
无定义
|
该字段值定义了一种格式化名字(Formatted Name),日常名字的表示方法。
|
基于X.520的普通名字语义规则
|
N
|
无定义
|
字段值表示人名或物名形式:
[Family Name];[Given Name];[Additional Names];[Name Prefix];[Name Suffix]
|
有些字段值可能只有一个“;”
|
PHOTO
|
GIF,CGM,WMF,BMP,MET,PMB,
DIB,PICT,TIFF,PS,PDF,JPEG,
MPEG,MPEG2,AVI,QTIME
|
字段值是图象数据或存储图象数据的文件名(包含URL路径)
|
没有默认的字段类型,所以必须指定一种字段类型
|
BDAY
|
无定义
|
字段值是出生日期的数据,有两种表示方法:
1)、基于ISO8601的基本格式:
<year><month><day>
2)、基于ISO8601的扩展格式:
<year>-<month>-<day>
其中年是四个字符表示,月份和日期是两个字符表示
|
|
ADR
|
DOM,INTL(*),
POSTAL(*),PARCEL(*),HOME,WORK(*)
|
分7个字段表示地址的值:
[Post Office Address];[Extended Address];
[Street];[Locality];[Region];[Postal code];
[Country]
|
第一个字段基于X.500标准,其余字段基于X.520标准
|
LABEL
|
DOM,INTL(*),
POSTAL(*),PARCEL(*),HOME,WORK(*)
|
字段值是一种日常表示地址的方法
|
基于X.520的邮政地址标准
|
TEL
|
PREF,WORK,HOME,VOICE(*),FAX,MSG,CELL,PAGER,
BBS,MODEM,CAR,ISDN,VIDEO |
字段值是基于X.520的电话号码表示方法,这种数据格式不能保证能被拨号程序直接使用,具体的数据格式解析应由拨号程序解决。
|
|
EMAIL
|
AOL,AppleLink,
ATTMail,CIS,eWorld,INTERNET(*),
IBMMail,MCIMail,
POWERSHARE,
PRODIGY,TLX,
X400
|
字段值是电子邮件地址
|
第二栏列出的是该字段类型的一部份,可能会有其它的类型
|
EMAILER
|
无定义
|
字段值是电子邮件软件的名称
|
|
TZ
|
无定义
|
字段值是某地时间相对于UTC(Coordianted Universal Time)的时差(时区),用正负值表示相对值,UTC以西则为负值,以东为正值,值表示根据ISO8610标准,有两种形式:
1)、<+/-><hour(two digit)><minute(two digit)>
2)、<+/-><hour(two digit)>:<minute(two digit)>
|
|
GEO
|
无定义
|
字段值表示某地的经度(longitude)和纬度(latitude)的地理位置信息,北纬为正值,南纬为负值,东经为正值,西经为负值:
<+/->[longitude value],<+/->[latitude value]
|
|
TITLE
|
无定义
|
字段值表示某人头衔名
|
|
ROLE
|
无定义
|
字段值表示一个人的职业名称或承担的角色或其它商务类型,基于X.520商务类型定义。
|
|
LOGO
|
GIF,CGM,WMF,
BMP,MET,PMB,
DIB,PICT,TIFF,
PDF,PS,JPEG,
MPEG,MPEG2,AVI,
QTIME
|
字段值表示某种标识的图像或肖像
|
没有默认字段类型,所以必须指定一种字段类型
|
AGENT
|
无定义
|
字段值表示与vCard对象所定义的人有关系的另一个人的信息(如管理员,助手,秘书等),字段值是一个完整的vCard数据包
|
|
ORG
|
无定义
|
字段值表示一个机构名称,基于X.520标准:
[Organization Name];[Organization Unit]
[;additional Organizational Unit;…]
|
|
NOTE
|
无定义
|
字段值为与本vCard对象有关的备注或提示信息,基于X.520标准。
|
|
REV
|
无定义
|
字段值表示最后一次的对本vCard对象的更新时间,时间采用日程表中的时间表示方法,基于ISO8601标准:
1)、<year(four digits)><month(two digits)>
<day(two digits)>T<hour(two digits)>
<minitue(two digits)><second(two digits)>
[time zone]
2)、<year(four digits)>-<month(two digits)>-
<day(two digits)>T<hour(two digits)>:
<minitue(two digits)>:<second(two digits)>
[time zone]
|
|
SOUND
|
WAVE,PCM,AIFF
|
字段值表示与本vCard对象有关的发音的声音数据,如该字段没有与其它字段分组,则该字段表示FN字段值的发音,字段值可以是二制的声音数据,也可以用其它单词表示的发音方法。
|
没有默认字段类型,当没有指定字段类型时,字段值为表示发音方法的文件或单词
|
URL
|
无定义
|
字段值表示统一资源位置(Uniform Resource Locator),基于IETF RFC 1738定义。
|
|
UID
|
无定义
|
字段值表示本vCard对象的GUID号或本vCard对象将被更新的URL地址
|
|
VERSION
|
无定义
|
字段值表示本vCard对象的版本号
|
该字段是必选字段,在更早以前的版本是可选
|
KEY
|
X509,PGP
|
该字段值表示加密密钥,默认的格式是明文格式(clear-text)
|
没有默认字段类型,字段类型必需被定义
|
X-<user- defined name>
|
无定义
|
该字段值由用户自定义
|
字段参数值由用户自选
|
注:1、字段类型后带“*”表示是默认字段类型;
2、字段值中若以“;”进行值分类的,当值中本身还包含有“;”或“\r\n”则必须进行转义,相应地用“\;”和“\”CRCF来进行转义。
附:
分行规则是:在一行中当存在至一少一个空格时,则可在空格前用CRLF(“\r\n”)进行分行,确保CRLF后有至少一个空格。
转自:http://blog.csdn.net/dznlong/archive/2007/08/05/1726921.aspx