字数统计
统计字符、中英文、行段、UTF-8 字节与预估阅读时间
—
字数统计为什么各家结果不一样:字符、码点、字节的区别
"多少字"至少有四种答案
同一个字符串,用不同的口径去数会得到不同的数字,而且每个数字都是"正确"的:
| 口径 | abc | 中文 | café | 😀 |
|---|---|---|---|---|
UTF-16 码元(JS 的 length) | 3 | 2 | 4 | 2 |
| Unicode 码点 | 3 | 2 | 4 | 1 |
| UTF-8 字节 | 3 | 6 | 5 | 4 |
| 用户感知的字符(字素簇) | 3 | 2 | 4 | 1 |
三个关键差异点:
- 汉字一个字占 3 字节。UTF-8 是变长编码:ASCII 1 字节、拉丁扩展 2 字节、中日韩 3 字节、Emoji 4 字节。所以"字符数"和"字节数"在中文里差三倍。这在数据库字段长度限制、API 体积限制、短信条数计算上都会直接影响结果。
- 带音标的拉丁字母占 2 字节。
café是 4 个字符但 5 字节,因为é不在 ASCII 范围内。更麻烦的是它还可能是e加组合音标两个码点——看起来一样,计数不同。这就是 Unicode 规范化(NFC/NFD)要解决的问题。 - Emoji 在 JavaScript 里算 2。JS 字符串是 UTF-16,BMP 之外的字符用代理对表示,所以
length会给出 2。而带肤色修饰或家庭组合的 Emoji(如 👨👩👧)由多个码点加零宽连接符组成,length可能到 8 以上,但用户看到的是一个字符。做字数上限校验时用length会误判——用户看到自己写了 10 个字却被提示超限,就是这个原因。
本工具分别给出字符数(UTF-16 码元)和UTF-8 字节数两个数字,就是因为实际需求同时存在这两种口径:面向用户界面的限制通常按字符,面向存储与传输的限制必须按字节。
中文的"字数"没有统一定义
英文用空格分词,所以"单词数"是明确的。中文没有词间空格,于是产生分歧:
- 按字符计。每个汉字算一个字,标点通常也算。这是中文里最常用的口径——"800 字作文"指的就是这个。
- 按词计。需要分词,不同分词器结果不同("研究生命起源"可分成"研究/生命/起源"或"研究生/命/起源")。只有做 NLP 时才用这个口径。
工具把中日韩字符单独统计,并把拉丁单词单独统计,就是为了让你能同时看到两个维度——混排文本(技术文档、产品文案)里只看其中一个数字会严重失真。
什么时候需要哪个数字
| 场景 | 该看哪个 | 原因 |
|---|---|---|
| 微博/评论字数限制 | 字符数 | 平台按字符校验(且可能按加权规则) |
| 数据库字段长度 | 字节数 | VARCHAR(n) 在多数数据库里按字节或按字符,取决于版本与配置,必须确认 |
| 短信计费 | 字节数 | 纯 ASCII 每条 160 字符,中文按 UCS-2 编码每条 70 字符 |
| 文章/论文摘要 | 字符数或词数 | 看投稿要求是"字"还是"words" |
| SEO 标题与描述长度 | 像素宽度 | 搜索引擎按渲染宽度截断,不是按字符数 |
| 字幕时长估算 | 字符数 + 阅读速度 | 见下一节 |
阅读时间的估算基准
工具会按字数估算阅读时间。参考基准:
- 英文默读约 200-250 词/分钟;中文默读约 300-500 字/分钟。
- 朗读要慢得多:英文约 130-160 词/分钟,中文约 200-250 字/分钟。做配音时长或演讲时间估算时要用朗读速度。
- 技术内容、含大量数字或代码的文本会明显更慢,实际时间可能是估算值的 1.5 倍以上。
所以这个数字只是量级参考,用于判断"这段文案是不是太长",不适合当成精确的时长承诺。
工具统计了什么
- 字符数、不含空白的字符数
- 中文字符数(含扩展 A 区)与英文单词数(数字串也算一个词)
- 行数与段落数(段落按空行分隔)
- UTF-8 字节数
- 预估阅读时间
全部在浏览器本地统计,不需要上传文本——统计长的内部文档或客户资料时这一点是必要的。
常见问题
中文和英文怎么算阅读时间?
按经验值估算:中文约 300 字/分钟,英文约 200 词/分钟,两者相加得出总时长。
UTF-8 字节和字符数为什么不同?
一个汉字在 UTF-8 中占 3 字节,emoji 占 4 字节,而字符数只算 1,所以字节数通常大于字符数。