生病的吉娃娃

欢迎使用WSBLog,有什么问题或意见请给我反馈,谢谢。

导航菜单

« 另一次逃脱答案 茸茸的孩子,老四DD(01) »

如何制作QR Code名片(中国移动格式)

使用Oucsoft.com提供的QR Code解码程序扫描中国移动格式的QR Code名片,发现该QR Code使用8bit的byte方式对名片信息进行编码,字符编码为GB2312。如下所示:



首先是以两个特殊字符打头,第一个字符的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);


——大功告成,呵呵。

  • quote 17.wang
  • 可不可以把这个QRCodeEncoder包传一下!邮箱shoowc@163.com!谢谢
  • 6/9/2009 10:59:00 PM
  • quote 16.test
  • 太麻烦了,不需要这样生成的。现在有了纯javascript生成的方式,很简单。生成的方法很多,都不是问题,就是解码这一块,有java的php的,还没有看到其他方式的。我指的不是软件类的。
  • 12/8/2007 1:53:00 PM
  • quote 15.maya
  • 我想问下如果我想把编码改成 国标码呢 GB/T18284-2000这个标准呢qre.CharEncoding = "GB2312";只改这里也不可以啊?请问怎么回事啊?
  • 10/1/2007 1:19:00 PM
  • quote 14.yang
  • 目前QRCodeEncoder是编译好的类库,没有提供源代码。不过,如果你真的有兴趣,可以用reflector之类的东西看。没有加密。
  • 7/31/2007 8:43:00 PM
  • quote 13.loozlv
  • 小弟现在也在研究2维码的知识,看了这篇文章后真的收获好大,但是还是有点问题
    我看到你在最后的代码段里有行这样的代码:
    QRCodeEncoder qre = new QRCodeEncoder(dataPath);
    我想请问下这个QRCodeEncoder是哪里的类,我在福谷里也看了下也没有这个类提供,能给我讲解下吗,谢谢

    What
    304looz@163.com
  • 7/25/2007 7:00:00 PM
  • quote 12.rex
  • http://diy.quickmark.com.tw/sa_chs/?c=400
  • 4/28/2007 9:26:00 PM
  • quote 11.xsxxx
  • ---------------------------

    ---------------------------
    QR Code编码失败。Read file error!
    ---------------------------
    确定
    ---------------------------
  • 4/1/2007 3:57:00 PM
  • quote 10.yang
  • cnForge上有下载的。
  • 3/7/2007 10:33:00 AM
  • quote 9.zhang
  • 请问上面那个web carmera qrcode decoder 软件还有下载吗?
  • 3/3/2007 2:22:00 AM
  • quote 8.yang
  • 是的,其实那个Lib无论编码、解码,都可以选择不同的Encoding的。解码的时候也有类似的属性可以选择。你试一下就知道了啊。
  • 1/26/2007 11:15:00 PM
  • quote 7.nerotang
  • 在cnforge上的csharp windowform例子library好像只能decode GB碼
    如果是繁體big5,日文就亂碼,
    不過encode依據你的例子應該可以改用不同編碼,在decode的部份應該都可以吧?
  • 1/25/2007 3:03:00 AM
  • quote 6.yang
  • 通过google提供的工具分析,这个网页时访问的频率最高的。嘿嘿。Haha
  • 12/15/2006 6:29:00 PM
  • quote 5.yang
  • 至于编码的数据和图像中的黑白的点的对应关系,就是标准定义的问题了。可以去标准出版社买本标准看,报出标准号就可以了。至于QR Code的标准号可以去找我以前的帖子或google一下。
  • 11/30/2006 12:33:00 AM
  • quote 4.yang
  • 赫赫,分号和冒号的问题,我不知道中国移动是否定义了转义字符之类的表示方式。我是从做好的QR Code名片中调试出它们的格式的。
  • 11/30/2006 12:33:00 AM
  • quote 3.fsa
  • 你能不能告诉我,这个编码与上面图像的对应关系又是怎样的。WhatWhat
  • 11/29/2006 9:06:00 PM
  • quote 2.fsa
  • 照程序的意思,输入的信息中还不能有分号与冒号。是不是?
  • 11/29/2006 9:03:00 PM
  • quote 1.yang
  • 生成的QR Code名片使用NOKIA 7610 QuickMark测试通过!
  • 11/28/2006 10:13:00 AM

发表评论:

Verificaton_Code

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点.

网站目录

Google

日历

最新评论

最近发表

Powered By WSBLog 1.6 Beta Build 60420

Copyright 2004-2006 wubuku.com. Some Rights Reserved.