在线字数统计工具:快速统计中英文字数和字符数
什么是字数统计
字数统计(Word Counter / Character Counter)是计算文本中字数、字符数、行数、段落数等指标的工具。在技术写作、SEO 优化和日常开发中非常实用。
为什么需要字数统计
- SEO 与篇幅规划:深度文章常见落在大约 1500–2500 词的区间,用计数器对照大纲份额,而不是事后注水
- 技术写作:控制文档长度,保持内容精炼
- 社交媒体:Twitter 280 字符限制、微博 140 字限制
- 论文提交:学术论文有严格的字数要求——投稿前先确认是「字符」还是「词」
- 代码审查:控制 commit message 和 PR 描述的长度
- API 设计:用 UTF-8 字节对照字段长度限制
中英文计数差异
中文和英文的字数统计有本质区别。ToolVault 的 字数统计工具 采用 Word/WPS 口径,并分项展示:
| 计数方式 | 英文 "Hello World" | 中文 "你好世界" |
|---|---|---|
| 字符数(含空格) | 11 | 4 |
| 字符数(不含空格) | 10 | 4 |
| 空白字符 | 1 | 0 |
| 词数(CJK+拉丁) | 2 | 4(每个汉字算一个词) |
| UTF-8 字节 | 11 | 12(每个汉字 3 字节) |
为什么中文字节数更多?
UTF-8 编码中:
- 英文字母:1 字节
- 中文汉字:3 字节
- Emoji:4 字节
这就是为什么一个中文字符在磁盘上占 3 个字节。工具同时给出 UTF-8 字节,方便对照数据库 VARCHAR、HTTP body 或短信计费上限。
本工具怎么计
- 字符:按 Unicode 码点计(一个 Emoji 计 1,不是 UTF-16 的 2);含空格 / 不含空格分列,并单独给出空白字符数
- 词数:每个汉字、假名、韩文音节计 1 词;拉丁与数字串按空格切词(连字符、撇号留在词内,如
state-of-the-art、don't) - 行与段落:物理行(含空行)与非空行对照;段落由空行分隔
- 阅读时间:约 400 CJK 字符/分钟 + 200 拉丁词/分钟;空白稿为 0 分钟,有正文时至少 1 分钟
如何使用在线字数统计工具
使用 ToolVault 工具匣 的 字数统计工具:
- 将文本粘贴到输入框
- 实时查看统计结果:
- 字符数(含/不含空格)、空白字符、UTF-8 字节
- 词数,以及 CJK 字符与拉丁/数字词分项
- 行数、非空行、句子数、段落数
- 预计阅读时间
- 支持中日韩与拉丁混排;稿件只在浏览器本地计算
字数统计的编程实现
下面示例对齐本站口径(勿只用空白切词——纯中文会被算成 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 工具匣。首页 汇集了更多浏览器本地工具。
相关工具
相关文章
Markdown 转 Word 交付指南:样式映射与行内降级
把 Markdown 草稿变成可交付的 .docx:pandoc 命令行与浏览器本地转换两条路线,标题/表格/代码块的 Word 原生样式映射对照,行内格式降级清单,以及「可编辑」为什么比「看起来像」更重要。
Word 转 Markdown 怎么转才干净:两条路线与格式保真对照
docx 转 Markdown 教程:pandoc 命令行与浏览器本地转换两条路线对比,标题/表格/图片/自动编号的保真行为,.doc 旧格式、图片体积、合并单元格等常见坑的解法。
中国车牌号规则与校验:普通牌、新能源与特殊格式全解
中国大陆车牌号编码规则详解:普通蓝牌、新能源 GA36D-2018、武警与使馆牌的结构、省份简称与发牌机关编码,附在线校验方法。