跳到主要内容
实用工具2026-07-066 分钟阅读

在线字数统计工具:快速统计中英文字数和字符数

什么是字数统计

字数统计(Word Counter / Character Counter)是计算文本中字数、字符数、行数、段落数等指标的工具。在技术写作、SEO 优化和日常开发中非常实用。

为什么需要字数统计

  1. SEO 与篇幅规划:深度文章常见落在大约 1500–2500 词的区间,用计数器对照大纲份额,而不是事后注水
  2. 技术写作:控制文档长度,保持内容精炼
  3. 社交媒体:Twitter 280 字符限制、微博 140 字限制
  4. 论文提交:学术论文有严格的字数要求——投稿前先确认是「字符」还是「词」
  5. 代码审查:控制 commit message 和 PR 描述的长度
  6. API 设计:用 UTF-8 字节对照字段长度限制

中英文计数差异

中文和英文的字数统计有本质区别。ToolVault 的 字数统计工具 采用 Word/WPS 口径,并分项展示:

计数方式英文 "Hello World"中文 "你好世界"
字符数(含空格)114
字符数(不含空格)104
空白字符10
词数(CJK+拉丁)24(每个汉字算一个词)
UTF-8 字节1112(每个汉字 3 字节)

为什么中文字节数更多?

UTF-8 编码中:

  • 英文字母:1 字节
  • 中文汉字:3 字节
  • Emoji:4 字节

这就是为什么一个中文字符在磁盘上占 3 个字节。工具同时给出 UTF-8 字节,方便对照数据库 VARCHAR、HTTP body 或短信计费上限。

本工具怎么计

  1. 字符:按 Unicode 码点计(一个 Emoji 计 1,不是 UTF-16 的 2);含空格 / 不含空格分列,并单独给出空白字符数
  2. 词数:每个汉字、假名、韩文音节计 1 词;拉丁与数字串按空格切词(连字符、撇号留在词内,如 state-of-the-art、don't)
  3. 行与段落:物理行(含空行)与非空行对照;段落由空行分隔
  4. 阅读时间:约 400 CJK 字符/分钟 + 200 拉丁词/分钟;空白稿为 0 分钟,有正文时至少 1 分钟

如何使用在线字数统计工具

使用 ToolVault 工具匣 的 字数统计工具:

  1. 将文本粘贴到输入框
  2. 实时查看统计结果:
    • 字符数(含/不含空格)、空白字符、UTF-8 字节
    • 词数,以及 CJK 字符与拉丁/数字词分项
    • 行数、非空行、句子数、段落数
    • 预计阅读时间
  3. 支持中日韩与拉丁混排;稿件只在浏览器本地计算

字数统计的编程实现

下面示例对齐本站口径(勿只用空白切词——纯中文会被算成 1 词)。

JavaScript

function analyzeTextStats(text) {
  const normalized = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
  const cjk = (normalized.match(
    /[\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af]/gu
  ) || []).length;
  const latin = (normalized.match(/[A-Za-z0-9][A-Za-z0-9'’-]*/g) || []).length;
  let chars = 0;
  let noSpace = 0;
  for (const ch of normalized) {
    chars += 1;
    if (!/\s/u.test(ch)) noSpace += 1;
  }
  const lines = normalized ? normalized.split('\n').length : 0;
  const nonEmptyLines = normalized
    ? normalized.split('\n').filter((l) => l.trim()).length
    : 0;
  const trimmed = normalized.trim();
  const paragraphs = trimmed
    ? trimmed.split(/\n\s*\n/).filter((b) => b.trim()).length
    : 0;
  const readingMin = trimmed
    ? Math.max(1, Math.ceil(cjk / 400 + latin / 200))
    : 0;
  return {
    characters: chars,
    charactersNoSpaces: noSpace,
    whitespaceChars: chars - noSpace,
    words: cjk + latin,
    cjkChars: cjk,
    latinWords: latin,
    lines,
    nonEmptyLines,
    paragraphs,
    readingTimeMinutes: readingMin,
    utf8Bytes: new TextEncoder().encode(normalized).length,
  };
}

Python

import math
import re

CJK_RE = re.compile(
    r'[\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff'
    r'\u3040-\u309f\u30a0-\u30ff\uac00-\ud7af]'
)
LATIN_RE = re.compile(r"[A-Za-z0-9][A-Za-z0-9'’-]*")

def analyze_text_stats(text: str) -> dict:
    normalized = text.replace('\r\n', '\n').replace('\r', '\n')
    cjk = len(CJK_RE.findall(normalized))
    latin = len(LATIN_RE.findall(normalized))
    chars = len(normalized)  # Python str is code points
    no_space = sum(1 for ch in normalized if not ch.isspace())
    lines = normalized.count('\n') + (1 if normalized else 0)
    non_empty = (
        sum(1 for line in normalized.split('\n') if line.strip())
        if normalized else 0
    )
    trimmed = normalized.strip()
    paragraphs = (
        len([b for b in re.split(r'\n\s*\n', trimmed) if b.strip()])
        if trimmed else 0
    )
    reading = max(1, math.ceil(cjk / 400 + latin / 200)) if trimmed else 0
    return {
        'characters': chars,
        'characters_no_spaces': no_space,
        'whitespace_chars': chars - no_space,
        'words': cjk + latin,
        'cjk_chars': cjk,
        'latin_words': latin,
        'lines': lines if normalized else 0,
        'non_empty_lines': non_empty,
        'paragraphs': paragraphs,
        'reading_time_minutes': reading,
        'utf8_bytes': len(normalized.encode('utf-8')),
    }

不同场景的篇幅参考

场景常见区间说明
博客文章1500-2500 词深度内容常见区间,覆盖度比凑字数更重要
产品描述150-300简洁突出卖点
技术文档按需精炼以读者能完成任务为准
Tweet/X 帖子≤280 字符平台限制
Commit message≤72 字符Git 社区惯例
PR 描述50-200 词充分说明变更

为什么每个工具给的数都不一样

「词」不是定义好的单位。英语按空白切(to be or not to be 是 5 词),但连字符复合词(state-of-the-art)按 1、3、4 词计的都有;缩写(don't)各异;CJK 无空格——「字数」变成字符数、或词典分词数、或两者分列。学术标准各自钉死定义——期刊投稿通常指拉丁文的空白分隔 token;出版合同写明计数方法是有原因的。计数有合同意义时,定义方法,不只是给数字。本站把方法写在界面分项上:CJK 字符与拉丁词分开报。

CJK 特例:字符而非词

中日韩的有意义单位是字符(漢字/かな/한글)——日语混排三文字,有用的计数器必须分开数汉字、假名、拉丁串。本工具把假名与韩文音节纳入 CJK 字符,再与拉丁词分列。翻译报价按源字符(CJK 方向);反向(英译中)按源词。给混合 CJK-拉丁文本报单一「词数」的工具在藏方法——找分项明细。固定形式的行数(俳句、古诗)是另一个学科,字数工具替代不了。

编辑工作流:计数是标靶不是判决

字数作为迭代目标才有价值:按 2 倍预算起草、砍到 1.2 压、润到预算内。职业习惯是分段对照预算份额计数——1200 字文章里 500 字的引言是结构性信号,总数看不出来。对照 行数与非空行:PDF 粘贴若几乎每行都非空,多半是硬换行污染。SEO 场景长度档位不如覆盖度重要;为凑字数注水读起来就是注水。用计数器找缺什么(对手跑 800 字你只有 200 的章节),不是给已有的注水。

FAQ

英文单词数怎么算?

拉丁与数字串按空格分隔,连字符与撇号可留在词内。"Hello World" 是 2 词;"Hello,World"(逗号打断)是 2 词;don't 是 1 词。

中文有"单词数"吗?

中文没有自然的单词边界。字数统计工具将每个汉字(及假名、韩文音节)计为 1 词,并单独列出拉丁词,避免混排时只剩一个不透明总数。

为什么同一个工具统计结果不同?

不同的计数规则会导致差异。例如:是否计入空格、是否按码点还是 UTF-16 单位、中英文混合时的分词策略等。建议先确认你需要的是字符、词,还是字节,再对照本工具的分项。

排查注记

「为什么每个工具给的数都不一样」放在实现代码之后,因为答案在定义层:词不是定义好的单位——连字符复合词按 1、3、4 计的都有,计数有合同意义时先定义方法、别只给数字。CJK 特例一节同样点破:中日韩的有意义单位是字符,给混排文本报单一「词数」的工具是在藏方法,要找分项明细——所以本工具把 CJK 字符与拉丁词分开列,Emoji 按码点计 1 而不是 UTF-16 的 2。编辑工作流的定位是「计数是标靶不是判决」:分段对照预算份额,1200 字文章里 500 字的引言是结构性信号,总数看不出来。


本文出自 ToolVault 工具匣。首页 汇集了更多浏览器本地工具。