# 让 iPhone 通讯录中的中文联系人按拼音顺序显示（Shortcuts）

> 本文公开全文。

原文：https://utgd.net/article/20111

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

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

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

- Shortcuts 动作下载

- GitHub 第一时间收到更新

## Shortcuts 动作使用

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

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

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

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

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

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

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

## 思路分析

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

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

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

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

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

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

---

[前往标准阅读页](https://utgd.net/article/20111?audience=web)
