目录
1.介绍
2.基本定义
3.字段信息
4,字段详解。
4.1,预定义类型的用法
4.2,基本类型
4.3,通讯地址类型
4.4,电信通信类型
4.5,地理类型
4.6,解释类型
5,应用。
6,效果。
7,Demo链接。
1.介绍
vCard(也称为电子名片)是一种常用的文件格式,用于存储个人和业务联系信息,例如姓名、电话号码、电子邮件地址等。vCard通常使用.vcf文件扩展名,并且可以通过邮件、短信或其他方式共享给他人。vCard最早由Versit联盟于1995年提出,该联盟成员包括苹果公司、AT&T科技(后来的朗讯)、IBM及西门子。
2.基本定义
vCard
必须以 BEGIN:VCARD
开头,以 END:VCARD
结尾。定义第二行为版本号 VERSION:3.0
或 VERSION:2.1
。
vCard
每行数据的格式为: 类型[;参数]:值
例如:TEL;TYPE=work,voice,pref,msg:+1-213-555-1234
类型:TEL,电话号码
参数:Type=work,voice,pref,msg,可选项
值:+1-213-555-1234
3.字段信息
键 | 字段名 | 介绍 |
---|---|---|
FN | (Formatted Name) | 表示格式化的名称,通常是一个人的全名。例如:John Doe。 |
N | (Name) | 表示姓名,包括姓、名、中间名、前缀和后缀。 |
ORG | (Organization) | 表示组织或公司名称。例如:ABC Company。 |
TITLE | (Job Title) | 表示职务或头衔。例如:Software Engineer。 |
TEL | (Telephone Number) | 表示电话号码。可以使用TYPE属性指定号码类型,如WORK(工作电话)、HOME(家庭电话)、CELL(移动电话)等。 |
(Email Address) | 表示电子邮件地址。 | |
ADR | (Address) | 表示地址信息。可以使用TYPE属性指定地址类型,如WORK(工作地址)、HOME(家庭地址)等。 |
URL | (Website URL) | 表示网站的URL。 |
NOTE | (Note) | 表示附加备注。 |
BDAY | (Birthday) | 表示生日日期。 |
PHOTO | (Photograph) | 表示照片。可以是URL或BASE64编码的图像数据。 |
REV | (Revision Date) | 表示vCard的修订日期。 |
UID | (Unique Identifier) | 表示唯一标识符,用于区分不同的vCard。 |
GEO | (Geographic Coordinates) | 表示地理坐标,通常用于指定地点的经纬度。 |
IMPP | (Instant Messaging and Presence Protocol) | 表示即时消息和在线状态。例如:Skype、WhatsApp等。 |
X-SOCIALPROFILE | (Social Media Profiles) | 表示社交媒体账户的链接。 |
4,字段详解。
4.1,预定义类型的用法
BEGIN,END
vCard 必须以 BEGIN:VCARD 开头,以 END:VCARD 结尾。
SOURCE:
类型用途:其值提供如何查找vCard源的信息
其值类型:uri
类型使用情况:很少使用
NAME
类型用途:与vCard源关联的可显示演示文本
其值类型:text
类型使用情况:很少使用
PROFILE
类型用途:标识内容类型中的信息所属的目录实体的类型,其值必须使用 vCard
类型使用情况:很少使用
4.2,基本类型
FN
目的:vcard对象的名称,一个vcard对象必须包含FN类型。例子:FN:Mr. John Q. Public, Esq.
N
目的:表示姓名,包括姓、名、中间名、前缀和后缀。
例子:
N:Public;John;Quinlan;Mr.;Esq.
N:Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.
各个组成部分可以用分号分号,每个组成部分可以用逗号。
NICKNAME
目的:表示别名、昵称
例子:
NICKNAME:Robbie
NICKNAME:Jim,Jimmie
PHOTO
目的:vcard对象的图像信息
ENCODING:默认是 uri,可以显式指定为 b,表示编码为内联的二进制数据
VALUE:默认是二进制值,可以显式指定为 uri 的值
TYPE:指定图像格式(主要用于内联二进制使用)
例子:
PHOTO;VALUE=uri:http://www.abc.com/pub/photos/jqpublic.gif
PHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
BDAY
目的:表示出生日期
例子:
BDAY:1996-04-15
BDAY:1953-10-15T23:10:00Z
BDAY:1987-09-27T08:30:00-06:00
4.3,通讯地址类型
ADR
目的:是一个组合,用来表示一个地址信息,值类型是一个用分号分开的文本值
例子:
ADR;TYPE=dom,home,postal,parcel:;;123 Main Street;Any Town;CA;91921-1234;A
ADR;HOME;POSTAL;PARCEL:;;街道地址;深圳;广东;444444;中国
TYEP参数说明:
“dom” 国内地址
“intl” 国际地址
“postal” 邮政递送地址
“parcel” 包裹递送地址
“home” 居住地址;
“work” 工作地址;
“pref” 有多个地址的时候,首选送达地址
缺省"TYPE=intl,postal,parcel,work",可以替换
LABEL
目的:是一格式化的文本值,表示一个地址
例子:
LABEL;TYPE=dom,home,postal,parcel:Mr.John Q. Public/, Esq./nMail Drop: TNE QB/n123 Main Street/nAny Town/, CA 91921-1234/nU.S.A.
类似于ADR,不同的是ADR的值是结构化文本,而LABEL其值是格式化的单一文本。
4.4,电信通信类型
TEL
目的:指定一个电话号码
例子:TEL;TYPE=work,voice,pref,msg:+1-213-555-1234
说明:值是一个规范的全球唯一的电话号码
TYPE参数的值有:
"home"表示家庭电话
“msg” 表示语音消息传递
“work” 工作电话
“pref” 表示多个电话中最喜欢使用的电话
“voice” 声音电话号码
“fax” 传真号码
“cell” 表示手机电话
“video” 视频电话
“pager” 寻呼设备号码
“bbs” 公告板系统号码
“modem” 调制解调器电话
“car” 汽车电话
“isdn” ISDN连接电话号码
“pcs” 个人通信服务电话
TYPE参数的缺省值是"voice",格式类似于ADR,可以替换。
EMAIL
目的:指定一个电子邮件
例子:
EMAIL;TYPE=internet:邮箱地址
EMAIL;TYPE=x400:邮箱地址
EMAIL;TYPE=internet,pref:邮箱地址
TYPE参数表示寻址类型,可用的值有:
“internet” 表示一个internet 类型地址
“x400” 表示是一个 X.400 地址
“pref” 最喜欢使用的邮件电子
缺省使用 “internet”
MAILER
目的:指定一个电子邮件发送者
例子:MAILER:PigeonMail 2.1
4.5,地理类型
TZ
目的:时区信息
例子:
TZ:-05:00
TZ;VALUE=text:-05:00; EST; Raleigh/North America
参数默认是utc-offset(utc偏移量)值,也可以设置为单个文本值。
GEO
目的:地理位置信息
例子:GEO:37.386013;-122.082932
含义:CEO 经度;纬度
组织类型
TITLE
目的:工作职务(job title)
例子:TITLE:Director, Research and Development
ROLE
目的:职业角色(occupation)
例子:ROLE:Programmer
LOGO
目的:公司logo,是一个图像信息,同PHOTO
例子:LOGO;VALUE=uri:http://www.abc.com/pub/logos/abccorp.jpg
AGENT
目的:代理者
例子:
AGENT;VALUE=uri: CID:JQPUBLIC.part3.960129T083020.邮箱地址
AGENT:BEGIN:VCARD\nFN:Susan Thomas\nTEL:+1-919-555-1234\nEMAIL;INTERNET:主机地址\nEND:VCARD\n
说明:缺省是一个Vcard对象,也可是一个URI指定的外部Vcard对象
ORG
目的:表示一个组织的名称
例子:ORG:ABC, Inc.;North American Division;Marketing
4.6,解释类型
CATEGORIES
目的:分类信息,例如旅行社、互联网、IT、工业、信息技术等
例子:
CATEGORIES:TRAVEL AGENT
CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY
NOTE
目的:对vcard的注释和说明
例子:NOTE:This fax number is operational 0800 to 1715EST, Mon-Fri.
PRODID
目的:指定创建Vcard对象的产品的ID
例子:PRODID:-//ONLINE DIRECTORY//NONSGML Version 1//EN
REV
目的:指定当前Vcard的修订版本信息
例子:
REV:1995-10-31T22:27:10Z
REV:1997-11-15
SORT-STRING
目的:指定按照 FN 或 N 中的哪段进行排序,而非首字母排序
例如:
FN:Rene van der Harten
N:van der Harten;Rene;J.;Sir;R.D.O.N.
SORT-STRING:Harten
SOUND
目的:指定Vcard的数字声音信息,缺省是指定vcard的name类型的发音信息。
例子: SOUND;TYPE=BASIC;VALUE=uri:CID:JOHNQPUBLIC.part8.19960229T080000.xyzMail@host1.com
SOUND;TYPE=BASIC;ENCODING=b:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
类似于PHOTO,可以指定外部 uri 或者使用内联二进制信息
UID
目的:指定一个全局唯一的个人或资源标识。
例子:UID:19950401-080045-40000F192713-0052
URL
目的:指定 vCard 的关联网址。
例子:URL:http://www.swbyps.restaurant.french/~chezchic.html
VERSION
目的:指定本vCard使用的规范版本。
例子: VERSION:3.0
安全类型
CLASS
目的:指定访问Vcard对象的访问分级。例如公共、私人、机密
例子:
CLASS:PUBLIC
CLASS:PRIVATE
CLASS:CONFIDENTIAL
5,应用。
UI层面
特别注意事项:
网址(示例中为:daqidiguo.com)请勿带有www。如果带有,其生成的二维码,微信将无法识别。
代码:
public partial class Form1 : Form
{
CreateQRCode creater = new CreateQRCode();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void btnCreateCode_Click(object sender, EventArgs e)
{
CardData data = new CardData
{
Address = txtAdress.Text,
Company = txtCompany.Text,
Department = txtDepartment.Text,
Email = txtEmail.Text,
MobilePhone = txtPhone.Text,
Name = txtName.Text,
Post = txtPosition.Text,
TelPhone = txtTel.Text,
Url = txtUrl.Text,
//图片转为Base64嵌入时,抛出异常,尝试两种二维码生成程序集皆是如此,所以这里未嵌入图片
Photo = true ? "" : GetBase64ByBitmap("dll/logo.jpg")
};
//加载logo图片
Image img = Image.FromFile("dll/logo.jpg");
Bitmap logo = new Bitmap(img, new Size(40, 40));
Bitmap map = creater.CreateQRCodeImage(data, new Size(picQRCode.Width, picQRCode.Height), logo);
// Bitmap map = BarMethHepler.Generate3(creater.GetVCardInfo(data), picQRCode.Width, picQRCode.Height);
picQRCode.Image = map;
}
string GetBase64ByBitmap(string fileName)
{
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
byte[] bytes = new byte[fs.Length];
int val = 0;
int index = 0;
while ((val = fs.ReadByte()) != -1)
{
bytes[index] = (byte)val;
index++;
}
return Convert.ToBase64String(bytes);
}
}
}
/// <summary>
/// 名片信息类
/// </summary>
class CardData
{
public string Name { get; set; }
public string Post { get; set; }
public string Department { get; set; }
public string Company { get; set; }
public string MobilePhone { get; set; }
public string TelPhone { get; set; }
public string Address { get; set; }
public string Email { get; set; }
public string Url { get; set; }
public string Photo { get; set; }
}
第三方二维码生成dll:https://download.csdn.net/download/lingxiao16888/89370033
using ThoughtWorks.QRCode.Codec;
class CreateQRCode
{
public string GetVCardInfo(CardData cardData)
{
//vCard 每行数据的格式为: 类型[;参数]:值
StringBuilder sb = new StringBuilder();
//vCard 必须以 BEGIN:VCARD 开头,以 END:VCARD 结尾。定义第二行为版本号 VERSION:3.0 或 VERSION:2.1。
sb.AppendLine("BEGIN:VCARD");
// sb.AppendLine("VERSION:2.1");
//FN:表示格式化的名称,通常是一个人的全名。例如:John Doe。
sb.AppendLine("FN:" + cardData.Name);
//N:表示姓
// sb.AppendLine("N:" + cardData.Name[0]);
//昵称
sb.AppendLine("NICKNAME:" + "tom");
//TITLE:表示职务或头衔。例如:Software Engineer。
sb.AppendLine("TITLE:" + cardData.Post);
//ORG:表示组织或公司名称。例如:ABC Company。
sb.AppendLine("ORG:" + cardData.Company + ";" + cardData.Department);
//TEL;表示电话号码。可以使用TYPE属性指定号码类型,如WORK(工作电话)、HOME(家庭电话)、CELL(移动电话)等。
sb.AppendLine("TEL;CELL:" + cardData.MobilePhone);
sb.AppendLine("TEL;WORK:" + cardData.TelPhone);
//ADR;表示地址信息。可以使用TYPE属性指定地址类型,如WORK(工作地址)、HOME(家庭地址)等。
sb.AppendLine("ADR;WORK:" + cardData.Address);
//URL:表示网站的URL。
sb.AppendLine("URL:" + cardData.Url);
//EMAIL:表示电子邮件地址。
sb.AppendLine("EMAIL:" + cardData.Email);
//ENCODING:默认是 uri,可以显式指定为 b,表示编码为内联的二进制数据
// VALUE:默认是二进制值,可以显式指定为 uri 的值
// TYPE:指定图像格式(主要用于内联二进制使用)
// PHOTO; VALUE = uri:http://www.abc.com/pub/photos/jqpublic.gif
// PHOTO; ENCODING = b; TYPE = JPEG:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
sb.AppendLine("PHOTO;ENCODING=b;TYPE=JPEG:" + cardData.Photo);
//vCard 必须以 BEGIN:VCARD 开头,以 END:VCARD 结尾。
sb.AppendLine("END:VCARD");
return sb.ToString();
}
public Bitmap CreateQRCodeImage(CardData cardData, Size size, Bitmap logoImg = null)
{
QRCodeEncoder encoder = new QRCodeEncoder();
encoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
//二维码大小
encoder.QRCodeScale = 3;
//二维码容错率
encoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
//二维码版本
encoder.QRCodeVersion = 0;
//根据信息获取对应的vCard
Bitmap qrcode = encoder.Encode(GetVCardInfo(cardData), Encoding.GetEncoding("utf-8"));
//将二维码绘制在指定图片上,同时将logo
Bitmap map = new Bitmap(size.Width, size.Height);
using (Graphics g = Graphics.FromImage(map))
{
//设置底色为白色
g.Clear(Color.White);
Point originPoint = new Point(20, 20);
g.DrawImage(qrcode, new Rectangle(originPoint, new Size(size.Width - originPoint.X * 2, size.Height - originPoint.Y * 2)), new Rectangle(0, 0, qrcode.Width, qrcode.Height), GraphicsUnit.Pixel);
//绘制logo
if (logoImg != null)
{
Point p = new Point((size.Width - logoImg.Width) / 2, (size.Height - logoImg.Height) / 2);
g.DrawImage(logoImg, p);
g.DrawRectangle(new Pen(Color.Red, 2), new Rectangle(p.X , p.Y , logoImg.Width , logoImg.Height ));
}
}
return map;
}
}
特别注意事项:
虽然vCard定义中有Photo键,其定义可携带二进制的图片,但尝试了两款二维码生成dll均抛出:“字符串长度超过许可范围”的异常。
6,效果。
微信扫描结果:
7,Demo链接。
https://download.csdn.net/download/lingxiao16888/89370039?spm=1001.2014.3001.5503