article_image

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

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

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

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

Alt text
在通知中显示字数统计的结果

Shortcuts 动作下载

GitHub

使用方式

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

Alt text
检查 Shortcuts 设置

在 iOS 上,使用方法如下:

  1. 在任何软件中选择一段文字,在其上下文菜单里找到“Share…”(分享);
  2. 在 Share Sheet(分享菜单)中点击运行“Words Count”动作;
  3. 稍等两秒,即可在通知中看到统计结果。2
Alt text
在 iOS 上统计字数的步骤

在 macOS,使用方式大同小异:

  1. 选中一段文字,在右键菜单(标准译名就是上下文菜单)中找到“Services”;
  2. 在“Services”中找到“Words Count”并运行;
  3. 稍等,通知中心很快会出现在通知中。
Alt text
在 macOS 上统计字数的步骤

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

统计原理

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

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

  1. 1 个汉字,比如 派 算 1 个字;
  2. 1 个英文单词,比如 Power 算 1 个字;
  3. 1 个全角标点,比如 。 算 1 个字;
  4. 2 个半角标点,比如 . 算 0.5 个字;
  5. 1 组数字,比如 60 算 1 个字;
  6. 空格不计。

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

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

  1. [\u4e00-\u9fa5] 匹配汉字,记下出现的次数;
  2. [a-zA-Z]+ 匹配英文单词,记下出现的次数;
  3. \d+ 匹配数字,记下出现的次数;
  4. 再接着是全角标点 [,。、?!()[]{}《》〈〉%*“”]
  5. 最后是半角标点 [!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]
  6. 把以上各步骤获得的数字加起来,就是最终结果。

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

Alt text
Shortcuts 的步骤

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

后记

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

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


  1. 当年 Shortcuts 尚未推出 macOS 版,为此我写了一个 Automator 动作,方便没有购买第三方软件的读者使用。如今 Shortcuts 登上 macOS,并不意味着就要把 Javascript 方案照抄一遍,而是提供了简化整个实现方式的机会。
  2. 截图中展示了分类统计的效果,但我提供下载的版本是只显示总字数的。如果对分类统计感兴趣,可以自己研究一下如何实现,这很有益于掌握 Shortcuts 的基础模块。
  3. 我确实没有找到具体的计算标准,只能通过逆向测试推出。

author_avatar

Lawyer, macOS/iOS Automation Amateur