首先是以两个特殊字符打头,第一个字符的ASC码值为1,第二个字符的ASC码值为16,用C语言风格的转义字符表示,则是:"\x01\x10",然后接下来的内容是(实际数据不分行,下面分行只是为了描述方便):
CARD:N:姓名;TIL:职位头衔;DIV:部门;COR:公司名称;
ADR:地址;ZIP:区号;
TEL:电话如053283888381;
FAX:传真如053283888381p1(p后面是分级号);
M:移动电话号码;
EM:Email如yanjiefeng@youcomany.com;
IM:即时通讯工具帐号如yangjiefeng@yourcompany.com;
URL:公司网址如http://www.oucsoft.com;;
——好了,既然知道了中国移动定义的QR Code的名片格式,就可以用QR Code的编码/解码Lib进行编码了。
打开VS,拖几个TextBox放在窗口上,分别命名为“TextBoxName”、“TextBoxTitle”等,然后,输入代码,大概如下:
private class BusinessCardField
{
public string Name = null;
public string Value = null;
public BusinessCardField(string strName, string strVal)
{
this.Name = strName;
this.Value = strVal;
}
}
——定义一个private的类,主要用于表示需要进行编码的名片内容,在下面的代码中会用到;
private BusinessCardField[] getBusinessCardFileds()
{
//中国移动定义的QR Code名片示例格式如下:
//以两个特殊字符打头:"\x01\x10",然后是:
//CARD:N:姓名;TIL:职位头衔;DIV:部门;COR:公司名称;
//ADR:地址;ZIP:区号;
//TEL:83888381;FAX:83888381p1;M:移动电话号码;
//EM:yanjiefeng@youcomany.com;IM:yangjiefeng@yourcompany.com;URL:http://公司网址;;
ArrayList fields = new ArrayList();
if ( this.TextBoxName.Text.Trim()!="" )
{
fields.Add( new BusinessCardField("N",this.TextBoxName.Text.Trim()) );
}
if ( this.TextBoxTitle.Text.Trim()!="" )
{
fields.Add( new BusinessCardField("TIL",this.TextBoxTitle.Text.Trim()) );
}
if ( this.TextBoxDepartment.Text.Trim()!="" )
{
fields.Add( new BusinessCardField("DIV",this.TextBoxDepartment.Text.Trim()) );
}
if ( this.TextBoxCompany.Text.Trim()!="" )
{
fields.Add( new BusinessCardField("COR",this.TextBoxCompany.Text.Trim()) );
}
if ( this.TextBoxAddress.Text.Trim()!="" )
{
fields.Add( new BusinessCardField("ADR",this.TextBoxAddress.Text.Trim()) );
}
if ( this.TextBoxZipcode.Text.Trim()!="" )
{
fields.Add( new BusinessCardField("ZIP",this.TextBoxZipcode.Text.Trim()) );
}
if ( this.TextBoxPhone.Text.Trim()!="" )
{
string strTel = this.TextBoxPhone.Text.Trim();
if ( this.TextBoxPhoneExt.Text.Trim()!="" )
{
strTel += "p"+this.TextBoxPhoneExt.Text.Trim();
}
fields.Add( new BusinessCardField("TEL",strTel) );
}
if ( this.TextBoxFax.Text.Trim()!="" )
{
string strFax = this.TextBoxFax.Text.Trim();
if ( this.TextBoxFaxExt.Text.Trim()!="" )
{
strFax += "p"+this.TextBoxFaxExt.Text.Trim();
}
fields.Add( new BusinessCardField("FAX",strFax) );
}
if ( this.TextBoxMobile.Text.Trim()!="" )
{
fields.Add( new BusinessCardField("M",this.TextBoxMobile.Text.Trim()) );
}
if ( this.TextBoxEmail.Text.Trim()!="" )
{
fields.Add( new BusinessCardField("EM",this.TextBoxEmail.Text.Trim()) );
}
if ( this.TextBoxIM.Text.Trim()!="" )
{
fields.Add( new BusinessCardField("IM",this.TextBoxIM.Text.Trim()) );
}
if ( this.TextBoxWebSite.Text.Trim()!="" )
{
fields.Add( new BusinessCardField("URL",this.TextBoxWebSite.Text.Trim()) );
}
return (BusinessCardField[]) fields.ToArray( typeof(BusinessCardField) );
}
——这个函数从用户输入的内容中返回需要进行编码的内容。调用它,并生成QR Code名片数据,可以像下面这样:
private void ButtonEncode_Click(object sender, System.EventArgs e)
{
string qrdata = "";
BusinessCardField[] fields = this.getBusinessCardFileds();
foreach( BusinessCardField f in fields )
{
qrdata += f.Name + ":" + f.Value + ";" ;
}
qrdata = "\x01\x10" + "CARD:" + qrdata + ";" ;
//qrdata就是需要编码到QR Code的数据了,接下来就是生成QR Code的事情了
//……
//……
}
——注意,生成QR Code的时候,如果所在的机器上不是中文的操作系统,需要选择字符编码为“GB2312”,像下面这样:
//注意这里,要给编码器一个编码数据文件所在的目录
string dataPath = System.Configuration.ConfigurationSettings.AppSettings["qrcodeDataPath"];
QRCodeEncoder qre = new QRCodeEncoder(dataPath);
qre.CharEncoding = "GB2312";
qre.ErrorCorrect = correctlevel;
qre.ModuleWidth = modwidth;
qre.MakeQRCode(qrdata);
qre.CodeImage.Save("图片保存到的路径",System.Drawing.Imaging.ImageFormat.Jpeg);
——大功告成,呵呵。