跳到主要内容
LeedyBox
支持我们

字数和字符数是如何统计的

把同一段文本粘贴到两个应用中,可能会得到两个不同的计数。两者未必有错:它们统计的是不同的东西。本指南介绍常见的计数单位,以及数字为什么会不同。

统计字符的四种方式

计算机以 Unicode 存储文本,“字符”可以在多个层面上衡量:

  • 字素簇是读者眼中的一个字符,例如“锓한”或“👍🏽”。
  • 码位是单个的 Unicode 值。一个可见字符可能由多个码位组成。
  • UTF-16 代码单元是 JavaScript 的 length 以及其他几种编程语言所统计的单位。基本多文种平面之外的字符(包括大多数表情符号)占两个单元。
  • UTF-8 字节是文件或数据库列中存储的单位。ASCII 字母占一个字节,带重音的拉丁字母通常占两个,韩文、中文和日文字符通常占三个,表情符号占四个或更多。
文本 字素 码位 UTF-16 单元 UTF-8 字节
a 1 1 1 1
é(单个码位) 1 1 1 2
é(e + 组合重音符) 1 2 2 3
한(韩文音节) 1 1 1 3
👍 1 1 2 4
👍🏽(带肤色) 1 2 4 8
👨‍👩‍👧(家庭表情符号) 1 5 8 18

组合重音符与韩文文本

有些字符可以用不止一种方式存储。“é”可以是一个预组合的码位,也可以是普通的“e”后跟一个组合重音符。两者看起来完全相同,但第二种形式多一个码位,也多一个字节。从某些系统复制的文本(例如某些操作系统中的文件名)可能使用分解形式。

韩文也有同样的问题。“한”这样的音节通常存储为一个码位,但也可以写成在屏幕上组合显示的独立字母(ㅎ、ㅏ、ㄴ)。基于字素的计数器在两种情况下都显示 1,而码位计数则显示 1 或 3。Unicode 规范化(NFC 或 NFD)可以在这两种形式之间转换。

不同语言中的词数统计

在英文中,按空格拆分就能得到合理的词数,不过带连字符的词、缩约形式、数字和 URL 在不同工具中仍可能有不同的计数方式。

中文、日文和泰文的词与词之间通常不加空格,因此按空格拆分会把整句话算作一个词。更好的计数器会使用依靠词典和规则的分词器。LeedyBox 计数器使用浏览器的 Intl.Segmenter,它可以识别许多语言的词边界。这些语言的分词在一定程度上取决于约定,因此结果可能与其他工具或人工计数不同。正因如此,这些语言的一些出版方会统计字符数而不是词数。

为什么应用和网站的计数不同

“最多 280 个字符”或“VARCHAR(255)”这样的限制,根据系统不同,可能以字素、码位、UTF-16 单元或字节来衡量。有些服务还会把链接按固定长度计算,或将某些文字按更高的权重计算。需要满足某个限制时,请先弄清目标系统使用哪种单位,再与该数字进行比较。LeedyBox 计数器会并列显示字素、UTF-16 单元和 UTF-8 字节,并附有限制检查功能,方便您以相应单位查看距离上限还有多少。

行、段落与换行

行数取决于换行的存储方式。Windows 通常使用两个字符(CR LF),而 Linux 和 macOS 使用一个(LF)。统计原始字符的工具可能会把 Windows 的换行算作两个字符。文本末尾的换行可能算作一个额外的空行,也可能不算。段落通常按由一个或多个空行分隔的文本块来统计,因此段落内部的单个换行不会开始新段落。

阅读时间估计

阅读时间是用词数除以假定的阅读速度计算出来的。实际速度因读者、语言和文本的专业程度而异,而词数本身也取决于分词。请将这个估计值视为规划时的粗略参考,而不是测量结果。

常见问题

为什么一个表情符号在某些应用中算作 2 个字符?

这些应用统计的是 UTF-16 代码单元。大多数表情符号存储为两个单元,带肤色或由多个人物组合的表情符号则占用更多单元。

数据库列的长度限制应该参考哪种计数?

请查阅数据库的文档。有些限制以字符为单位,有些以字节为单位,因此通常需要比较的是 UTF-8 字节数。

计数器会把我的文本发送到别处吗?

LeedyBox 字数与字符统计在您的浏览器中运行,因此您粘贴的文本在您的设备上统计。