使用方法
把一段文字丢进来读数,四步搞定:
- 把要统计的文字粘进文本框,或直接改上面那段演示文本(演示文本 5 段 9 行,可整段替换)。上限 200000 字符,超了会提示先拆分。
- 「段落切分方式」选按空行切分或每行算一段。中文稿件一般用前者;处理歌词、代码注释、地址清单这类一行一条的列表时,用后者更贴合。
- 「统计时忽略纯空白段落」选忽略或不忽略。忽略时空行不计入段落数,适合正常文章;想数清文档里到底有多少空行,就选不忽略。
- 点「开始统计」,或在文本框按 Ctrl + 回车(Mac 是 Command + 回车)。八张卡片立刻更新;想核对每个数字怎么来的,看下方口径对照表,还能导出 CSV 或复制成 TSV。
段落统计能解决什么
它解决「编辑让我控制在 8 段以内,我到底写了几段」这类随时要查数字的问题,适合三类场景:
- 投稿与作业字数核验:演示文本 5 段、288 字,非空字符 275,中文字符 239 —— 不同平台对「字数」的定义不同,把三个数字一起交上去就不会被退回。
- 排版前的结构体检:平均段落 55.00 字、最长段落 119 字,两者差一倍多,说明第 4 段明显偏长,拆开后阅读节奏会舒服很多。
- 清洗粘贴来的文本:总行数 9、空行数 4,一眼看出复制时混进了多少个空行;切到「每行算一段」再统计一次,就能判断这些空行是段落分隔还是排版残留。
本页不做的事:不做语法、拼写或可读性评分;不按 Markdown 标题、缩进或列表符号识别层级,标题行与普通行一视同仁;不统计词频与关键词密度;不改动原文,也不提供分列或排序等改写功能。
原理和变量
① 用了哪个具体函数:核心是 String.prototype.split 配合正则 —— 按空行切分用 /\n\s*\n/,按行切分用 /\r?\n/;字符数用 text.length,非空字符用 text.replace(/\s/g, '').length,中文用 /[\u4e00-\u9fff]/g 匹配计数,全部不依赖分词库。
② 关键参数为什么这样取:中文正则取 CJK 统一汉字(U+4E00–U+9FFF)而不是整个东亚区段,是为了排除全角标点、假名和韩文;英文单词用连续拉丁字母串计数,是为了让「don't」这类缩写稳定算 2 个,而不是靠空格切分得到的不可预测结果。
③ 遵循哪个标准:字符总数按 UTF-16 码元计,与 JavaScript 字符串长度一致,因此一个 emoji 或生僻字会算 2;段落切分遵循常见的空白行分隔约定。不同编辑器对「字数」定义不一,本页因此并列给出含空白、不含空白与纯汉字三个口径。
④ 输入怎么变成输出:演示文本先按 /\n\s*\n/ 切成 5 段,逐段去掉空白后分别得到 66、31、37、119、22 字,最大的是第 4 段 119;非空字符总数 275 除以 5 得平均 55.00;句子按句末标点切成 8 句。
⑤ 边界与阈值:文本上限 200000 字符,超过会提示先拆分再统计;平均值小数位限 0~4;文本为空时段落数、行数、字符数均为 0,并给出「文本框是空的」提示而不是静默返回 0;只有空白字符的文本按「全是空段落」处理。
⑥ 常见误用的正确解释:字符总数与「非空字符数」差 13(288 对 275),差的是换行和空格,不是统计错误;把「每行算一段」用在正常文章上会让段落数等于行数,看起来像变多了,其实是口径变了;emoji 与部分生僻字算 2 个字符也与平台显示不一致,需要精确字数时请以目标平台为准。
完整示例(数值仅作演示)
用演示文本、按空行切分、忽略纯空白段落、平均值保留 2 位:
- 切分结果:5 段,各段非空字数依次为 66、31、37、119、22。
- 行数:9 行,其中非空行 5、空行 4。
- 字符总数:288;去掉空白后 275;其中中文字符 239。
- 英文单词:2 个(English、words)。
- 句子数:8 句;最长段落 119 字;平均段落 55.00 字。
- 切到「每行算一段」并忽略空白段:段落数仍是 5,因为 4 个空行被忽略;若改成不忽略,段落数立刻变成 9。
最后这一组对比最能说明「切分方式」和「是否忽略空白」两个开关的实际影响,建议自己切一次体会,再决定用哪种口径报数字。
输入范围与对照表
输入范围:任意文本,上限 200000 字符;段落切分两档(空行 / 每行);是否忽略纯空白段落两档;平均值小数位 0~4。下表列出全部统计项的口径与演示值:
| 统计项 | 计算口径 | 演示值 |
|---|---|---|
| 字符总数 | 含空格与换行的全部 UTF-16 码元 | 288 |
| 非空字符数 | 去掉所有空白字符后剩余 | 275 |
| 中文字符数 | 命中 CJK 统一汉字区间的字符 | 239 |
| 英文单词数 | 连续拉丁字母串的个数 | 2 |
| 总行数 | 按换行符切分后的行数 | 9 |
| 非空行数 | 去掉空白后仍有内容的行 | 5 |
| 空行数 | 只剩空白字符的行 | 4 |
| 段落数 | 按一个或多个空行切分 | 5 |
| 非空段落数 | 去掉纯空白段落后的段数 | 5 |
| 最长段落字数 | 各段非空字符数的最大值 | 119 |
| 平均段落字数 | 非空字符数 ÷ 非空段落数 | 55.00 |
| 句子数 | 按中英文句末标点切分 | 8 |
| 中文标点数 | 。,、;:!?与成对引号括号 | 23 |
| 数字串个数 | 连续数字串的个数 | 1 |
| 首段字数 | 第一个非空段落的非空字符数 | 66 |
| 末段字数 | 最后一个非空段落的非空字符数 | 22 |
| 平均每行字数 | 非空字符数 ÷ 非空行数 | 55.00 |
对照表里「字符总数 288 对非空字符 275」这 13 的差额,就是 8 个换行加若干空格,核对数字来源时先看这一项。
结果边界和舍入
舍入位置:平均段落字数、平均每行字数按「平均值小数位」保留(默认 2 位,Number(v.toFixed(d)));其余计数类结果都是整数,不做四舍五入。演示值 275 ÷ 5 正好整除,所以 2 位与 0 位显示都是 55 与 55.00 的差别。
什么时候会拒绝统计:文本超过 200000 字符会提示先拆分;小数位不在 0~4 会提示并回退到 2;文本框为空会给出「文本框是空的」提示。其余输入都是下拉选择,不存在非法值。
单位和精度:字符数按 UTF-16 码元计,一个 emoji 或增补平面汉字记 2;中文字符只认 CJK 统一汉字区间,扩展区与兼容区不计入;句子按 。!?!?;; 切分,省略号与引号内的句末标点也会算作分句点。
结果性质:这是按固定口径给出的机械计数,不理解语义。标题行不会被单独识别,代码块、表格与引用也会一并计入字符数;不同平台对「字数」定义不同,请以最终提交平台的计数为准。
常见问题
字符总数和非空字符数差多少算正常?
差额就是文本里的换行与空格总数。演示文本差 13(288 对 275),对应 8 个换行和若干空格。差额特别大通常说明复制时混进了大量空行或缩进。
为什么段落数比想象中多(或少)?
先看切分方式:中文文章应按空行切分;误选「每行算一段」会让段落数等于行数。再看是否忽略纯空白段落:不忽略时,4 个空行也会各自成段。
emoji 为什么算两个字?
本页按 UTF-16 码元计数,增补平面字符(多数 emoji 与部分生僻汉字)由两个码元组成,因此记 2。这与 JavaScript 的字符串长度一致,但可能与某些平台的显示字数不同。
能只统计选中的一部分吗?
不能。本页统计整个文本框的内容。要统计其中一段,请先把那部分单独复制到文本框,或把其余内容删掉后再统计。
句子数是按什么拆的?
按中英文句末标点 。!?!?;; 切分,统计切完还剩内容的片段数,演示文本为 8 句。省略号和引号内的句末标点同样会算作分句点,所以对话体可能偏高。
平均值的小数位能改吗?
能。「平均值小数位」限 0~4,默认 2。改成 0 时平均段落字数显示 55,改成 4 时显示 55.0000,按你要提交的精度选。
能导出统计结果吗?
能。点「复制结果」拿八张卡片的数字,或用下方「导出 CSV」把口径对照表存成表格、「复制对照表」复制成 TSV 直接贴进表格软件。
我的文本会被上传吗?
不会。统计在浏览器内完成,刷新即清空;可在 Network 面板复查,点「开始统计」时没有任何请求发出。
相关工具
- 花体文本生成器:排版前先试试特殊字体的显示效果。
- 列表倒序工具:把逐行清单倒过来重排。
- Constant大小写转换器:统一英文名词的大小写写法。
- 词频统计工具:数完段落再看看高频词分布。
- Monospace文本生成器:需要等宽排版时用。
- Twitter字体生成器:社交平台的字体样式转换。
- 衬线文本生成器:换成衬线风格后再统计字数。