article_image

西文操作系统环境下,iPhone 通讯录中文联系人的排序一直乱作一团,默认情况下,所有中文姓名的联系人都会被丢到“#”分类下,无法通过首字母快速查找。

大约在 2014 年前后,在 iPhone 用户中还掀起过一波关于该问题的讨论,网友们八仙过海,可惜碍于系统限制,出的招却没有一个让人满意:有的手工为姓氏添加注音(Phonetic Last Name),几十上百个联系人也硬着头皮上;有的把通讯录整个贡献给第三方软件,让它们帮忙添加拼音信息;彼时越狱蔚然成风,也有人选择安装越狱插件以实现拼音顺序排序……这些方法都带着典型的“前自动化时代”气息,要么全靠人工操作,要么把数据交给莫名其妙的开发商,没有一个居中的选择。

而在 Shortcuts(快捷指令)成为系统级工具的“用户自动化时代”,可以换一个思路,用 Shortcuts 来解决中文联系人排序这一历史遗留问题,在批量完成排序的同时,也不用把隐私信息1提供给第三方。

Alt text
让通讯录在英文环境下通过拼音排序

Shortcuts 动作使用

使用本文 Shortcuts 前,需要先了解一下外语环境中下中文姓名的排序原理。无论是文章开头提及的手动操作也好,还是各种“通讯录助手”提供的自动注音服务也罢,都利用了通讯录的注音(Phonetic)信息。和姓名、电话、地址等基础信息一样,注音也是联系人(包括 iOS 和 Android)信息的一项,常常用于东亚语言的——主要是中文、日文和韩文——的排序,因为这些语言的文字并非西文字母写成,不能直接根据“ABC”排序。

以手动操作为例,其核心就是给联系人信息添加注音字段,输入姓氏和名字的拼音;而第三方服务说穿了就是将这一过程代为完成,原理上并无差别。

意识到突破点在注音字段之后,我就基于 Shortcuts 的联系人模块设计了一个动作,用于完成和第三方服务一样的事情:自动添加注音、实现排序。区别在于,Shortcuts 毕竟是苹果的原生应用,在隐私方面的担忧可以降到最低。

第一步,需要前往系统设置,在联系人设置的排序选项(Contacts-Sort Order)中,将排序设置为先姓氏、再名字(Last, First),这样比较符合中文使用习惯,比如微信通讯录就是先姓再名的排列顺序。

Alt text
将 Last Name 作为排序依据以契合中文习惯

第二步,准备自动添加注音。运行本文提供的 Shortcuts 动作,稍等片刻即可列出所有尚未添加过注音的联系人(有些读者可能已经为部分联系人添加过注音,有必要将已有注音的联系人过滤掉),之后还可以做一次手动筛选,将采用英文、法文、德文等不需要注音信息的联系人取消勾选。选好联系人可以继续运行,等待 Shortcuts 为他们添加注音。

Alt text
为联系人添加姓名拼音

运行完成后,打开通讯录,就可以看到原本挤在“#”分类下的中文联系人都被排到了姓氏对应的字母分类下,井井有条。

Alt text
让通讯录在英文环境下通过拼音排序

理论上,本文动作也能够适用于日文和韩文姓名的自动注音、排序,但考虑到多音字词——比如音读训读——的存在,日文的实际效果似乎不如中文(韩文我则是彻底不懂,无法测试)。汉语姓氏自动注音之所以不难实现(第三方服务在六七年前就完成了同样的事情),是因为汉字当作姓氏时往往只有一个读法,比如“单”作姓氏时就读第四声的“shan”,不太需要担心多音字问题。而日文则比较复杂,写成汉字的日本姓氏常常有好几个读音,在日本动漫和日剧中就常有“写作xx,读作yy”的自我介绍,以免对方误读;有一个极端的例子,“小鳥游”这一姓氏读作“takanashi”,读音来自“taka“(老鹰)和“nashi”(没有),意为没有老鹰所以小鸟出来游玩,从读音到汉字实为“意译”,这类姓氏若交给机器处理,出错机率估计就比较大。2

思路分析

编辑联系人信息的模块发布得较晚,直到 2020 年才加入 Shortcuts,因此苦于中文姓名排序的人虽多、却一直没有人往 Shortcuts 这条路上想也是有以致之。

在我分享这一 Shortcuts 动作后,不少网友表示自己早就养成了手动注音添加的习惯,甚至有人说自己掌握了背诵联系人信息、完全不同通讯录软件的技能。管见倒以为,添加注音和主动记账还不一样,在国内消费环境中,记账本身就不可能自动化,只能强迫自己养成记账的习惯;而添加注音则不然,完全能够、也应当让机器代劳。

用 Shortcuts 来处理注音,也算是新瓶装旧酒,但有一个迈过去的坎儿:从姓氏汉字获取对应拼音。Shortcuts 并未内置“拼音转换”之类的模块,而引入第三方 API 又有背保护隐私的初衷,设计动作中这一问题曾让我骑虎难下。最后,我尝试将中文姓名翻译成英文来暗渡陈仓。

Alt text
通过将中文名翻译为英文获得拼音

当然,具体的实现没有那么简单,直接将姓名翻译过去会变成蹩脚喜剧,比如“周一一”可能会被翻译成“Monday One”,可见翻译引擎自作主张地将其当成词组、进而意译了。于是,我在姓氏与名字之间加了一个空格以免混淆,同时在整个姓名前面加上 my name is 以强调我想翻译的是名字而非词组。这样一通折腾,终于拿到了姓名的英文版,基本可以直接当成拼音使用——不过,既然是“英文版”而非真正的拼音,偶尔就有把“李”翻译成“Lee”、把“He”翻译成“Ho”的情况,倒是不影响通讯录排序,可如果日后有更精确的拼音获取方案,我估计还是会忍不住更新本文动作。

另一个细节则是需要过滤掉无需添加注音的联系人。随着联系人的增加,日后可能还要运行本文动作,这时候全部重新添加一遍注音就很蠢,又慢又徒劳,务必要把已经有注音的联系人剔出去;除此之外,本身就用西文字母写成的联系人姓名也用不着添加注音,这部分需要手动选择一下。自动过滤加手动选取,就能把无需注音的联系人筛出去。

Alt text
筛选出没有添加过注音的联系人

类似的过滤技巧在不少 Shortcuts 动作中都有用到,比如《用 Shortcuts 和 Charty 制作 Apple Watch 风格的统计圆环》一文中,我曾经用获取健康数据的模块过滤出当日睡眠统计数据,避免无关数据造成干扰。这些 Shortcuts 模块的过滤机制和 Finder 智能文件夹类似,都是添加几组条件并设置其关系(同时满足还是满足一项即可),尽管目前可用的过滤条件数量比起 Finder 还是小巫见大巫,但三三两两条件组合出来的“过滤器”往往也起到了关键的筛选作用。善用过滤,通常可以大大降低 Shortcuts 的数据处理量,提高其运行效率。


  1. 严格来说,本文方案还是需要把联系人姓名提供给微软翻译或 Apple 自己的引擎,但单纯只是姓名而非整个通讯录,谈不上“隐私”
  2. 这篇文章写得比较早,草稿成文于 2020 年,如果读者发现日文机器处理已有改善,欢迎在评论中指出。

author_avatar

Lawyer, macOS/iOS Automation Amateur