背景
众所周知,小米手机自带通讯录的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
其他注意事项
- 支持
UTF-8与GBK编码 - 多个同类型数据之间顺序必须正确(显示优先级问题)
- 前面一溜不允许更改,且必须具备以下几个字段
BEGIN(开始一位联系人)VERSION(版本号)FN(姓名)TEL(电话)END(该联系人结束)
- 如果你需要使用 2.1 版本,请自行将上述所有
非ASCII字符转义为ASCII字符- 举例,就像浏览器的地址栏转义中文字符一样,不过最终需要把所有的
%替换为=) - 代码示例:
urllib.parse.quote_plus(str(你想转换的东西)).replace("%", "=") - 大部分字段都和3.0版本不一致,需要自己找文档
- 举例,就像浏览器的地址栏转义中文字符一样,不过最终需要把所有的
- 不要更改大小写
BEGIN:VCARD和END:VCARD字段之间不允许存在空行
吐槽
- 小米没有任何文档,网上也找不到标准文档中各字段映射到小米通讯录里面的对应关系,不支持4.0也不标明,还不允许用户选择是否导出附加信息
- 这vcard3.0标准怎么支持还支持不完全啊,魔改了一部分东西,例如标准里面的pref字段(prefer的意思)被直接忽略了……
- email字段也被魔改了一部分……
- 不指定语言会出大问题,每一项牵扯到中文的都必须指明语言
- 唯一的好消息是魔改支持gbk……
- 一开始我以为公司后面的部门(职位)是直接通过公司字段(ORG)的值指定的,用逗号隔开就行,结果测试导入半天没点对的,然后换其他字段,结果ROLE也不对,试了半天最后发现是TITLE……
- 经典中文搜不到 up-to-date 的
vcard标准的相关资料,全是停留在2.1版本(九十年代的玩意),3.0版本基本没有还全是车轱辘话,4.0的资料直接绝迹