办公室里有时忙起来,会频繁进入这样一个循环,想找某个人的电话-去找名片-找不到名片-去查看手机-手机按解锁开关-手机滑屏/指纹/密码/图形解锁-手机按通话按键-输入那个人姓名的部分-找到电话-输入到PC中的QQ-发送给某某-手机锁屏-喘口大气...

更要命的,有的时候短时间内这个循环会频繁被循环调用,我了个去,我就碰到过,于是那是就有了一个念头,如果能在PC显示器上有一个小输入框(就像当初的各家流氓一样),我输入“张三”,就能给我显示张三的电话,甚至是邮件地址、公司名称等多方便啊。有了这个念头心里就很鸡冻,因为其实这很容易做到,因为:

1. 数据就可以来自我们每台手机的通讯录的基础功能,导出联系人为 vCard 文件(*.vcf)

2. vCard文件其实就是有规定格式的文本文件

3. 对程序员而言简直是小菜一碟,对我这个普通爱好者来说,也只不过是费点事儿研究一下格式而已,如果仅仅是读取电话甚至更简单。

但是...这种需求毕竟是暂时的、随机性很强,过了需要它的时候就显得不那么迫切了,过了一段时间突然又想起来,闲来无事就先简单研究一下 vCard 吧,没什么技术含量,只为给自己做个笔记。

首先,vCard 文件的读取用 UTF-8 就可以,因为它自身要么只包含数字和英文字符,其它字符被编码了,要么即便包括 UTF-8 应该也能正常读取。

第二,文本的每一“行”都代表了一个特定的项目内容,具体含义可以参照度娘或相关rtf档案。简单来说,vCard每一行都在说一件事,一个内容,如“TEL;CELL:137xxxxxx27”(不包含双引号)一看便知这一行说的是电话,电话号码是“137xxxxxx27”

第三,每一行都有规定好的分隔符把相关内容分开,分隔符是半角英文的

第四,英文冒号“:”就是一个分隔符,冒号以前的是项,是参数,是“这一行是什么内容”,冒号以后的是“具体数值”。如“TEL;CELL:137xxxxxx27”,冒号前面是“TEL;CELL”,意思是这一行内容说的是电话,是什么电话呢,是CELL类型的电话(手机),冒号后面就是具体内容,电话号码是“137xxxxxx27”

第五,英文分号“;”用来把属性/参数做区分和说明,比如“FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E9=99=88=E7=A3=8A”的这样一条信息。冒号前面是“FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE”,分号把它们分成了三部分分别是“FN”、“CHARSET=UTF-8”、“ENCODING=QUOTED-PRINTABLE”,意思依次是“这一行的内容是FN”(rtf规定标记),“编码方式是UTF-8”,“被写在文件里的编码方式是QUOTED-PRINTABLE”。在这里多解释一下后两种编码的含义,比如中文姓名“张三丰”,用UTF-8编码方式变成了byte[],比如是{136,213,67,88,100,247},再用“QUOTED-PRINTABLE”编码方式把byte[]变成了“:=E9=99=88=E7=A3=8A”保存在vCard文件里,这就是参数中两种编码各自的作用。(注:手机程序是不是这么做的我不清楚,但我反向读取反正是成功了)

C# 读取 vCard 格式的更多相关文章

  1. 内容写到 csv 格式的文件中 及 读取 csv 格式的文件内容

    <?php/*把内容写到 csv 格式的文件中 基本思路是:1.用 $fp = fopen("filename", 'mode')打开一个csv文件,可以是打开时才建立的2. ...

  2. Android读取JSON格式数据

    Android读取JSON格式数据 1. 何为JSON? JSON,全称为JavaScript Object Notation,意为JavaScript对象表示法. JSON 是轻量级的文本数据交换格 ...

  3. hadoop用mutipleInputs实现map读取不同格式的文件

    mapmap读取不同格式的文件这个问题一直就有,之前的读取方式是在map里获取文件的名称,依照名称不同分不同的方式读取,比如以下的方式 //取文件名 InputSplit inputSplit = c ...

  4. Excel 转 vCard格式、CSV格式

    Excel 转vCard格式(常用于Gmail, Yahoo, 163等).CSV格式(常用于Outlook, Foxmail等) 最近公司邮件通讯录需要更新,我就将原来的通讯录给删除了,准备重新导入 ...

  5. libxl 的使用,读取时间格式

    最近开发使用到 libxl,用的是3.8.0 破解版. 具体过程: 1.将lib.dll放在exe同目录下,在代码中引用 libxl.lib #pragma comment(lib, ".\ ...

  6. 读取siftgeo格式文件的matlab程序

    % This function reads a siftgeo binary file %读取siftgeo格式的二进制文件 % % Usage: [v, meta] = siftgeo_read ( ...

  7. 读取Cert格式证书的密钥

    不想存储Cert证书内容,只想存储证书密钥,可通过以下实现读取证书的密钥出来: package com.zat.ucop.service.util; import sun.misc.BASE64Enc ...

  8. 读取P12格式证书的密钥

    不想存储p12证书内容,只想存储证书密钥,可通过以下实现读取证书的密钥出来: package com.zat.ucop.service.util; import org.apache.commons. ...

  9. c# 用OpenXmL读取.xlsx格式的Excel文件 返回DataTable

    1.须要引用的dll :  DocumentFormat.OpenXml.dll  ---须要安装一下OpenXml再引用 WindowsBase  ---直接在项目里加入引用 2.方法: /// & ...

随机推荐

  1. 终于会用c#中的delegate(委托)和event(事件)了

    一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和e ...

  2. shell 命名管道,进程间通信

    命名管道基础 命名管道也被称为FIFO文件, 在文件系统中是可见的,并且跟其它文件一样可以读写! 命名管道特点: 当写进程向管道中写数据的时候,如果没有进程读取这些数据,写进程会堵塞 当读取管道中的数 ...

  3. [译文]c# /.Net 技巧: ToDictionary() and ToList()

    前言: 有两个简单好用的LINQ扩展方法 ToDictionary() 和ToList(),你可能知道或不知道,但是它的的确确可以简化查询转化为集合的任务: 简介: LINQ和延迟执行 据你所认识的L ...

  4. 通过SMTP协议来发送邮件

    简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是事实上的在Internet传输email的标准. SMTP是一个相对简单的基于文本的协议.在其之上指定了 ...

  5. Redis源代码分析(二十七)--- rio制I/O包裹

    I/O每个操作系统,它的一个组成部分.和I/O业务质量,在一定程度上也影响了系统的效率. 今天,我在了解了Redis中间I/O的,相同的,Redis在他自己的系统中.也封装了一个I/O层.简称RIO. ...

  6. MySQL存储引擎差异化实验

    本篇把MySQL最常用的存储引擎给大家做一个介绍,然后通过插入.修改和并发实验来了解和验证一下它们之间的一些差异. 一.MySQL存储引擎简介 存储引擎在MySQL结构里占据核心的位置,是上层抽象接口 ...

  7. Coreseek:索引和检测的第二步骤施工

    1,非常索引easy,代码行 g:/service/coreseek/bin/indexer -c g:/service/coreseek/etc/csft_mysql.conf   person 在 ...

  8. RegularExpressionValidator控件

    原文:RegularExpressionValidator控件 ★搜Asp.net★(www.soAsp.net),为专业技术文档网站.包括Asp.net开发技术文档·C#开发技术文档·Access/ ...

  9. Dojo仪表板

    Dojo它提供了一个良好的仪表板显示器,的影响,如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR0lTU2hpWGlTaGVuZw==/font/ ...

  10. 4行代码实现js模板引擎

    在平时编码中,经常要做拼接字符串的工作,如把json数据用HTML展示出来,以往字符串拼接与逻辑混在在一起会让代码晦涩不堪,加大了多人协作与维护的成本.而采用前端模板机制就能很好的解决这个问题. 精妙 ...