最近要实现一个用c#导出安卓电话本的功能,即*.vcf格式的电话本文件,网上查了很长时间,发现有说用csv导出的,excel导出的基本都是借助工具去导出,没有查到用响应的代码导出电话本的方式。经过一番周折,最终还是顺利的导出了想要的数据:
1.首先我们了解一下.vcf格式的文件是什么,.vcf是微软自带的通讯录vCard文件的后缀名,其实通俗来讲也只是个文本文件,即:你只需要使用txt按照正确的vCard文件的格式编写一段脚本,改一下后缀名就可以得到一个名片。代码如下:

public static void CreateCard(){FileStream fs = new FileStream(@"D:/a.vcf", FileMode.Create);StreamWriter sw = new StreamWriter(fs);sw.WriteLine("BEGIN:VCARD");sw.WriteLine("VERSION:2.1");sw.WriteLine("N;CHARSET=UTF-8;ENCODING=QUOTED-    PRINTABLE:"+"六七");sw.WriteLine("TEL;CELL:153 2913 3892");sw.WriteLine("END:VCARD");sw.Flush();sw.Close();fs.Close();;}

————————————————————————————
2.这样在D盘你就能看到一个名片格式的vcf文件,但是点击开文件后发现手机号码是正常的,名称的中文出现乱码了。这是因为名片格式使用了Quoted-Printable方式进行编码。网上查了下Quoted-Printable编码定义,其实很简单,就是将要编码的文字转换成byte字节流,然后使用十六进制的char型和“=”联合表达出来,如=0C表示12。下面提供编码及解码的方式:

Quoted-Printable编码
public static string EncodeQuotedPrintable(string value){if (string.IsNullOrEmpty(value))return value;StringBuilder builder = new StringBuilder();byte[] bytes = Encoding.UTF8.GetBytes(value);foreach (byte v in bytes){if ((v == 9) || ((v >= 32) && (v <= 60)) || ((v >= 62) && (v <= 126))){builder.Append(Convert.ToChar(v));}else{builder.Append('=');builder.Append(v.ToString("X2"));}}char lastChar = builder[builder.Length - 1];if (char.IsWhiteSpace(lastChar)){builder.Remove(builder.Length - 1, 1);builder.Append('=');builder.Append(((int)lastChar).ToString("X2"));}return builder.ToString();}
Quoted-Printable解码public static string DecodeQuotedPrintable(string input, string charSet){Encoding enc;try{enc = Encoding.GetEncoding(charSet);}catch{enc = new UTF8Encoding();}var occurences = new Regex(@"(=[0-9A-Z]{2}){1,}", RegexOptions.Multiline);var matches = occurences.Matches(input);foreach (Match match in matches){try{byte[] b = new byte[match.Groups[0].Value.Length / 3];for (int i = 0; i < match.Groups[0].Value.Length / 3; i++){b[i] = byte.Parse(match.Groups[0].Value.Substring(i * 3 + 1, 2), System.Globalization.NumberStyles.AllowHexSpecifier);}char[] hexChar = enc.GetChars(b);input = input.Replace(match.Groups[0].Value, new String(hexChar));}catch{ ;}}input = input.Replace("?=", "").Replace("\r\n", "");return input;}

3.通过第2步我们就能将汉字转换成正确的Quoted-Printable编码方式了,这样我们最终修改第1步中的代码,将汉字部分使用Quoted-Printable进行编码

public static void CreateCard(){FileStream fs = new FileStream(@"D:/a.vcf", FileMode.Create);StreamWriter sw = new StreamWriter(fs);sw.WriteLine("BEGIN:VCARD");sw.WriteLine("VERSION:2.1");sw.WriteLine("N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:"+EncodeQuotedPrintable("六七"));sw.WriteLine("TEL;CELL:153 2913 3892");sw.WriteLine("END:VCARD");sw.Flush();sw.Close();fs.Close();;}

最终,我们在D盘得到了一个正确的名片,接下来导入安卓手机使用通讯录打开,这是中文显示的就是正常的六七,但是这个编码格式在pc端是不可用的,中文依旧乱码,pc端使用的是ascii编码方式,详情可自行研究。

C#导出VCF格式电话本,遇到QUOTED-PRINTABLE编码的问题,附带QUOTED-PRINTABLE编码解码相关推荐

  1. Android 导出.vcf格式通讯录方法

    最近在做的项目中涉及到Android手机联系人同步,google到导出vCard格式联系人的方法 参考自 http://blog.csdn.net/ID19870510/article/details ...

  2. 电话本VCF乱码完美解决

    我们通常从电话中导出VCF电话本后,会发现电话本中的人名是乱码,其实是文件编码的问题.下面说一下我是怎么解决的 一.文件改名 文件改名,我们可以用changeFn这个比量文件改名工具免费版,将文件扩展 ...

  3. 三星手机通讯录导出 .spb格式转.vcf

    三星手机通讯录导出 .spb格式转.vcf 三星GALAXY S4手机屏幕损坏,能正常开机,无法进行其他操作,拿去修屏幕已经没必要,现在主要把通讯录和照片导出到另一部安卓手机. 导出照片比较容易,手机 ...

  4. 通讯录VCF格式批量生成

    办公室明明做了工作人员通讯录,但在要找某同事电话时才发现,手机通讯录里没存啊!然后速速打开群文件找到通讯录文件,找到对应的电话后发现,诶,QQ群文件的Excel表格不能直接复制文本出来,又得手动一个个 ...

  5. E680g手机电话本起死回生记

    下面是我这个周末的郁闷经历:   打开E680g发现电话簿中没有了记录,而且短信簿也打不开,点击会弹出"等待初始化",大概是数据库坏了.公司估计有做GSM的team可以帮忙解决,可 ...

  6. utf—8在苹果手机上乱码_如何解决iPhone5S电话本导入乱码的情况

    很多人导入电话本会出现这个问题,那么怎么解决呢? 电话本格式基本为vcf,首先用记事本打开电话本,格式如下: --------------分割线-------------------- BEGIN:V ...

  7. android 手机号码去重,微信电话本和qq通讯录有什么不同?微信电话本常见问题汇总...

    微信电话本可谓是QQ通讯录的全新升级产品,重新整合进微信团队后,不仅仅UI界面更加类似微信,且功能上可将联系人对应的微信头像导入通讯录中,还可以识别陌生号码,支持来电号码归属地显示等等.对很多从QQ通 ...

  8. 解析VCARD文件(vcf格式)导入QQ通讯录功能

    参考了这篇文章: http://www.blogjava.net/sundc/archive/2008/08/04/219877.html http://www.blogjava.net/sundc/ ...

  9. excel转vcf格式通讯录的批量方法

    简介 因为工作中接触的客户比较多,我通常习惯使用Excel表格来存放我的通讯录.但当通讯录的人越来越多的时候,手动添加到手机就不太现实了. 讲一讲我今天找到的一个Excel表格文件转vcf通讯录文件的 ...

  10. Excel转成vCard(vcf格式)的5种方法 | 古意人

    2019独角兽企业重金招聘Python工程师标准>>> Excel转成vCard(vcf格式)的5种方法 | 古意人 Excel转成vCard(vcf格式)的5种方法 2014年10 ...

最新文章

  1. 不追逐标准化产品,360数科的一站式风控体系有何不同?
  2. SQL进阶教程 | 史上最易懂SQL教程 5小时零基础成长SQL大师
  3. 2020-07-14 CVPR2020 i3DV论文讨论(4) 笔记
  4. 我理解消化后的浮点数存储
  5. 515. 在每个树行中找最大值
  6. java jsp ajax_ajax的json传值方式在jsp页面中的应用
  7. 望城2019年华为软件云项目_今天,华为、京东两大项目在长沙开工
  8. jsp网站使用ffmpeg实现为.flv格式视频截图
  9. 数据可视化图表有哪些类型
  10. yolov3-tiny 训练一个检测器(2)
  11. 达观RPA自动订单处理机器人, 助力制造业订单处理效率提升
  12. 【剑指offer】Python、java,C++三种语言同时实现
  13. 乐玩模块脚本实战教程辅助脚本制作开发视频
  14. educoder锁存器和触发器设计—JK触发器设计+T触发器设计
  15. 《高效能程序员的修炼》一磨刀不误砍柴工
  16. php抢票程序,HTML实现抢票功能(设定时间打开抢票的页面)
  17. [UVALive - 4329] Ping pong 树状数组入门
  18. 扁平化easyUI default皮肤
  19. java.io.InvalidClassException:CartonPrintVO; local class incompatible: stream classdesc serialVersio
  20. html图片自动滚动播放器,jQuery+css实现图片滚动效果(附源码)

热门文章

  1. python第三方库笔记本_Python用什么笔记本电脑较好?
  2. web前端vue项目完整步骤。pc端
  3. 有用但用处不多的html的属性
  4. [转]一个IT人的辞职信:怀着梦想去远行!
  5. 移动4g手机信号测试软件,中移动4G网络测试:网速快但信号不稳
  6. yaml参数文件的使用
  7. Timer定时器用法详解
  8. 三季度国内光伏市场需求仍将强劲
  9. 计算机的语言栏怎么更改,win7电脑语言栏不见了如何修复
  10. python爬取作品集_Python爬虫爬取哈利波特小说集,并用数据可视化剖析登场人物...