【奇怪教程】小米手机的通讯录Vcard导入

背景

众所周知,小米手机自带通讯录的vcf导入导出功能极不友好。

在导出时,小米手机会自动把你编辑的联系人详情删除,只给你导出联系人的手机号和姓名,至于你编辑的公司、职位、称呼、地址等等所有信息一概清除,甚至还在用罪大恶极不支持中文的Vcard 2.1标准(疑似为了兼容某些老玩意过于保守了)

而导入时,它又没有任何文档告诉你他支持Vcard(vcf)标准到了多少,是 2.1(2.1的标准过于古老以至于没找到标准的官方文档),3.0 还是 4.0……不仅如此,小米还没告诉你他的每个字段到底是和标准中的什么玩意对应的……

今天我鼓捣了一晚上终于把常用的东西鼓捣齐了,如下面所示。

导入时支持的版本

2.1、3.0

示例(Ver 3.0)

代码

BEGIN:VCARD
VERSION:3.0
FN;language=zh-Hans:姓名
TEL;TYPE=WORK:12345678901
TEL;TYPE=HOME:98765432109
ORG;language=zh-Hans:公司名
TITLE;language=zh-Hans:部门(职位)
EMAIL;TYPE=WORK:[email protected]
EMAIL;TYPE=HOME:[email protected]
END:VCARD

其他注意事项

  1. 支持 UTF-8GBK 编码
  2. 多个同类型数据之间顺序必须正确(显示优先级问题)
  3. 前面一溜不允许更改,且必须具备以下几个字段
    • BEGIN(开始一位联系人)
    • VERSION(版本号)
    • FN(姓名)
    • TEL(电话)
    • END(该联系人结束)
  4. 如果你需要使用 2.1 版本,请自行将上述所有 非ASCII字符 转义为 ASCII字符
    • 举例,就像浏览器的地址栏转义中文字符一样,不过最终需要把所有的 % 替换为 =
    • 代码示例: urllib.parse.quote_plus(str(你想转换的东西)).replace("%", "=")
    • 大部分字段都和3.0版本不一致,需要自己找文档
  5. 不要更改大小写
  6. BEGIN:VCARDEND:VCARD 字段之间不允许存在空行

吐槽

  1. 小米没有任何文档,网上也找不到标准文档中各字段映射到小米通讯录里面的对应关系,不支持4.0也不标明,还不允许用户选择是否导出附加信息
  2. 这vcard3.0标准怎么支持还支持不完全啊,魔改了一部分东西,例如标准里面的pref字段(prefer的意思)被直接忽略了……
  3. email字段也被魔改了一部分……
  4. 不指定语言会出大问题,每一项牵扯到中文的都必须指明语言
  5. 唯一的好消息是魔改支持gbk……
  6. 一开始我以为公司后面的部门(职位)是直接通过公司字段(ORG)的值指定的,用逗号隔开就行,结果测试导入半天没点对的,然后换其他字段,结果ROLE也不对,试了半天最后发现是TITLE……
  7. 经典中文搜不到 up-to-date 的 vcard标准 的相关资料,全是停留在2.1版本(九十年代的玩意),3.0版本基本没有还全是车轱辘话,4.0的资料直接绝迹
5 个赞

我从来不用手机厂商的通讯录同步功能。

之前都是用微软live邮箱的 exchange

不过最近微软收紧了服务, 只能安装它家的 outlook APP来实现了。

2 个赞

哪里会删除,我刚换手机,小米导出通讯录数据都正常

通讯录+日历+邮件还是统一用微软Exchange或者Google吧……这些年换过Android、黑莓、Windows Phone、iOS,对Exchange和Google的兼容性都很好

你有备注或邮箱或明确区分工作号与生活号吗?没有那肯定正常……

我专门提就是因为以VCard格式导出以后备注、工作号生活号、邮箱等等诸多信息全部消失才搞的这玩意……要是你就需要个姓名+手机号,那肯定是没问题的……