猫工具站
帮助中心 猫Blog 关于我们 广告合作 EN

清理文本与统计文本:这两个页面数的不是同一件事

文本更新于 2026-09-29

多数文本活儿其实是两件事:把内容弄干净,以及弄清自己手里有多少东西。文本格式化 和 字数统计 正好各管一头,全部在页面里完成——不上传、输入框也没有长度上限。但这两个页面的结论都值得先弄清规则再采信,因为它们替你做了不少决定。

十五个动作,只有部分尊重你的换行

每个动作都是读输入框、把结果写到下面。它工作的单位比按钮名字更要紧:

  • 按字符——UPPERCASE、lowercase、Title Case,不动行结构。
  • 按行——Trim Lines、Remove Empty Lines、Remove Duplicates、Sort Ascending/Descending、Add Line Numbers、Remove Line Numbers、Reverse Lines,都是先拆行、处理、再拼回去。
  • 按空白——Merge Spaces,以及两个全角/半角转换。

最容易踩的一个:Add Line Numbers 给每一行都编号,空行也算一行,于是段落之间的空行会占掉一个序号。先 Remove Empty Lines 再编号;反过来做,序号就会跳。

Title Case 不是「首字母大写」这么简单:它把单词其余字母全部转小写。McDonald 变 Mcdonald,iPhone 变 Iphone。原文里有驼峰命名或人名前缀时,别点它。

Merge Spaces 不等于 Trim Lines

两者看着像同一件事的两种说法,实际不同:

  • Merge Spaces 把行内任意位置的连续空格和制表符压成一个空格,同时去掉每行首尾空白。因此它会毁掉缩进——代码、YAML 这类靠行首空格表达层级的内容,千万别过这一步。
  • Trim Lines 只去每行首尾空白,行内空格与相对缩进都保留。

从 PDF 或网页里复制出来的碎文本,通常该用 Merge Spaces;有结构的内容,先从 Trim Lines 起手。

排序按拼音,也把数字当数字

两个排序动作共用一套比较规则:汉字按拼音读音排,行内数字按数值排,大小写视为相同。

于是会出现普通字母序给不了的结果:

  • chapter9 排在 chapter10 前面——这是普通字典序会排反的地方。
  • 汉字按读音而不是码位:阿(ā)靠前,张(zhāng)靠后。
  • Apple 与 apple 视为相等,而相等的行保持它们在原文里的先后。

如果你要的是按码位排(例如要和另一个系统的输出逐字节对上),这一步不该用它。

Remove Duplicates 是整行精确匹配,且有一个坑

去重比较的是整行,区分大小写也区分空白:Foo 和 Foo(结尾多一个空格)是两行,都会留下。想让近似行合并,先跑 Trim Lines 再去重。

坑在实现方式:它用一个普通对象当「已见过」的集合。凡是行文本恰好等于 Object.prototype 上继承来的属性名——toString、constructor、valueOf、hasOwnProperty、__proto__——第一次出现就被判定为重复并丢掉。概率很低,但如果你的文件是一串标识符列表而少了其中一行,原因就在这。

全角半角不是互逆的两步

  • 全角转半角 转换的是标准全角 ASCII 区(U+FF01–U+FF5E),并把表意空格 U+3000 换成普通空格。、 。 《》 这类只有中文才有的标点它不动——它们本来就没有 ASCII 对应字符。
  • 半角转全角 转换的是整个可打印 ASCII 区 U+0020–U+007E,字母、数字、标点全在内,连空格都会变成 U+3000。

所以对着英文段落点第二个按钮,会得到一整片 FULL-WIDTH 的字符——这不是 bug,是中文排版里对齐宽度时的正当需求,但更多时候是误触。

Reverse Lines 和 Reverse Text 改的不是一个东西

Reverse Lines 只颠倒行的先后,每行内容不变,适合把日志变成「新的在前」。Reverse Text 颠倒的是单个字符,每个词都反过来读。它按码点反转,所以 emoji 这类增补平面字符不会裂开——按 UTF-16 单元反转的话会。

为什么两个「字符数」不一样

文本格式化输入框下面的计数,和字数统计里的「字符」不是同一种度量,只要文本里有 emoji 或生僻汉字就会露出来:

  • 格式化器的计数按 UTF-16 编码单元,😀 算 2,增补平面的字一律翻倍。
  • 字数统计按码点,同一个 😀 算 1。

行数同样有差别:格式化器在空内容时显示 0 行;字数统计从 1 起算,每个换行加 1,包括结尾的那一个——所以以换行结尾的文件,行数比肉眼看到的多 1。字数统计还把单独的回车符(\r)也算一次换行,这只有早年 Mac 生成的文件才会遇到。

词数其实是两个数

字数统计页上有一大一小两个看起来都叫「词」的数字:

  • 顶部大数字 = 汉字个数 加 英文单词个数。一整段纯中文在这里会有一个漂亮的数字。
  • 网格里的 Words = 只数英文单词。同一段纯中文显示 0。

英文单词的匹配规则是「连续的 ASCII 字母,中间允许撇号和连字符」。这条规则有三个后果:

  1. 带重音的字母会断词。café 只匹配到 caf,算一个词;于是 café naïve 报出的总数比它实际的词数多。
  2. 数字不算词。数字单独计数,且带分隔符的算一个:1,234.50 记 1 个 Numbers。
  3. Letters、Uppercase、Lowercase、Digits 全部只认 ASCII。é 记一个字符,但不记一个字母。

高频词那一排同样按这个分界:先最多 8 个英文词(单字母词被排除),再最多 8 个汉字,混在一行里且不加区分标签。看到 的 和 because 并排时,那是两张榜单首尾相接,不是一张。

句子怎么数,阅读时间怎么算

句子按 。 ! ? . ! ? 切分,连续多个只算一次:等等……什么?! 是两句,不是四句。同一条规则会让小数和缩写虚增句数——3.14 和 Mr. 各被当成一次句末,于是「平均每句长度」也一起偏。

阅读时间是总词数 ÷ 300,向上取整且至少 1 分钟;朗读时长按 180 算。由于分子是汉字与英文词的混合量,这是一个混合速率下的估计值:用来比较自己几篇稿子的相对长短很合适,拿去对外承诺「本文阅读时长 4 分钟」就不太可靠。

改了输入,结果框不会自己更新

这是本组工具里唯一会静默给出错误答案的地方。你敲字时只有输入框下面的计数在刷新,下面的结果框仍是上一次动作的输出,两个框看起来毫无变化。改完输入必须重新点动作。另外 Result → Input 会把当前结果搬回输入框并清空结果框,这正是把 Merge Spaces 接在 Remove Duplicates 之前、而不必复制粘贴的办法。

两个小提醒:输入为空时所有按钮什么都不做,也不提示;Copy Result 在浏览器拒绝剪贴板权限时同样静默——「✓ Copied」只在成功时才出现。

什么都不保存

这两个页面都不写存储、不留历史、也不能导出文件。Clear 会同时清空两个框;而在字数统计里,Clear 和 Load Example 都会立刻覆盖你的输入,不弹确认。结果要紧就先复制走,再动其他按钮。需要留存的内容应该放到浏览器记事本——那是站内唯一会替你保存的页面。

本指南用到的工具

广告