# iOS & macOS 通用字数统计方案（Shortcuts）

> 本文公开全文。

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

四年前，我因不满于写作工具——主要是 Ulysses——统计中文字数不准，转而自己编写了统计脚本，其结果近似 Microsoft Word，令人满意。

四年过去，老牌写作软件多数健在，新秀也是辈出，可惜中文字数统计这个细节却鲜有人做得好，我的旧方案直到今年年底还有人在讨论，我自己也一直在使用。不过，旧方案需要使用 Javascript，这延续了我写爱脚本的习惯，却限制了能够选用的自动化工具，通常还意味着你要买一个第三方软件。

近来两件小事也让我反思当年的实现方式。其一，Drafts 更新了其 Javascript 内核，导致我部分动作失效（尽管不是统计字数的动作），而修复这些动作是要掏钱订阅的；其二，有读者希望我帮他编写脚本，这类请求其实让双方都很尴尬，因为我还得自掏腰包买他在提到的那个第三方软件。

重新检视旧思路后，我不禁莞尔：统计字数其实没有那么困难，只需要免费的 Shortcuts 就可以了；而 Shortcuts 又是 iOS 和 macOS 通用的软件，我新编写的动作，无需任何修改也就能在两个平台上运行。

Shortcuts 动作下载

GitHub

## 使用方式

相较旧方案在 iOS 和 macOS 各自为政的做法，基于 Shortcuts 的新方案可以通行于两个系统。下载安装 Shortcuts 动作后，请在动作编辑界面中检查其设置项目，确保勾选了“Show in Share Sheet”和“Use as Quick Action”两项，它们分别用于在 iOS 和 macOS 上启动动作。

在 iOS 上，使用方法如下：

- 在任何软件中选择一段文字，在其上下文菜单里找到“Share…”（分享）；

- 在 Share Sheet（分享菜单）中点击运行“Words Count”动作；

- 稍等两秒，即可在通知中看到统计结果。

在 macOS，使用方式大同小异：

- 选中一段文字，在右键菜单（标准译名就是上下文菜单）中找到“Services”；

- 在“Services”中找到“Words Count”并运行；

- 稍等，通知中心很快会出现在通知中。

由于 Shortcuts 可以任何所选文本的上下文菜单中运行，因此不管你使用哪一款写作工具或笔记软件，都可以配合 Shortcuts 来统计字数。申言之，只要是能够选中文本的地方，都可以统计字数，包括电子书阅读器和网页。

## 统计原理

想统计字数，只需要弄明白两件事，第一件是统计的标准是什么，这个问题可以替换成“Microsoft Word 的统计标准是什么”；第二件则是如何实现前述统计方式。Microsoft Word 是公认的官方标准，《中华人民共和国国家标准：翻译服务规范（GB/T 19363\.1\-2003）》也以 Word 的统计结果为基础。

四年前，我大致解决了第一问，推知以下计算方式：

- 1 个汉字，比如 派 算 1 个字；

- 1 个英文单词，比如 Power 算 1 个字；

- 1 个全角标点，比如 。 算 1 个字；

- 2 个半角标点，比如 \. 算 0\.5 个字；

- 1 组数字，比如 60 算 1 个字；

- 空格不计。

一旦列出这些标准，关于具体方案的第二问其实也迎刃而解：使用正则表达式（Regular Expression），匹配“汉字”“英文单词”“全角标点”“半角标点”和“数字”各自出现了多少次，然后累加之。而恰好正则表达式的灵魂就是模式匹配，它很容易从一长段文本中找出所有的“汉字”或“英文单词”。比如，表达式 \[\\u4e00\-\\u9fa5\] 就表示一个汉字，据此，只要知道正则表达式匹配到了几组 \[\\u4e00\-\\u9fa5\]，也就获知中文字数几何。

而 Shortcuts 恰好内置了正则表达式，无需乞援其他软件。于是接下来的思路就简单了：

- 用 \[\\u4e00\-\\u9fa5\] 匹配汉字，记下出现的次数；

- 用 \[a\-zA\-Z\]\+ 匹配英文单词，记下出现的次数；

- 用 \\d\+ 匹配数字，记下出现的次数；

- 再接着是全角标点 \[，。、？！（）［］｛｝《》〈〉％＊“”\]；

- 最后是半角标点 \[\!@\#$%^&\*\(\)\_\+\\\-=\\\[\\\];'\:"\\\\\|,\.\<\>\\/?\]。

- 把以上各步骤获得的数字加起来，就是最终结果。

考虑到很多部分重复了，我提供的动作用“Repeat with each”模块简化了大量操作，只需预先把正则表达式填入文本框（每写一句换一行），就可以逐项匹配。惟需注意，半角标点每个仅算半个字，因此需要另外计算。

以上所有计算方式都是准对中英文混合的文本，如果涉及其他语言，应当只需要找到对应的正则表达式，然后追加到第一个文本框中即可（假设那些语言的字数统计方式也和中文或英文类似），例如日文是 \[\\u3040\-\\u309F\\u30A0\-\\u30FF\]，其他语种只要搜索 语种 \+ 正则表达式，也不难找到。

## 后记

仔细想想，其实四年前就可以写出现在这一版的 Shortcuts 动作，本文所涉及的核心模块在四年前都已具备，起码在 iOS 上并不需要折腾代码。我未曾多想就选择了 Javascript，主要还是使用移动设备不多，直接把桌面端的解决方案挪过去用了。

不过，也不必否定旧方案。我自己目前在用的就是 Javascript 版，因为我习惯了 LaunchBar 等自动化工具，而 Javascript 只需稍作修改，就可以用在这些第三方工具中。可毕竟不是人人都会写脚本，也不是每个人都会购买这些进阶工具，此时就可以用 Shortcuts 来兜底，作为门槛最低的一条备用路径。

---

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