字数统计:中文、英文、表情符号到底怎么算
把同一段文字粘进两个统计工具,得到两个不同的数。两个都不一定算错,因为「字数」「字符数」「长度」各自都有不止一种定义,而你要满足的限制,又是由平台的开发者自己定义的。
字符数:空格、换行和「一个字符」是什么
人们说的「字符数」其实是三种数字:
| 数字 | 空格 | 换行 |
|---|---|---|
| 字符数(含空格) | 算 | 一般不算 |
| 字符数(不含空格) | 不算 | 不算 |
UTF-16 编码单元数,即 JavaScript 里 string.length 的结果 | 算 | 算一个或两个 |
对普通英文,前两种相差的就是空格的个数,需要哪一种取决于你面对的规则。论文系统和 meta 描述的常见限制按含空格的字符数算;有些翻译报价按不含空格的字符数算。拿到数字之前先确认是哪一种。
第三行是大多数不一致的来源。程序员读到 "hello".length 会以为它等于人眼看到的字符个数。普通字母确实如此,其他文字就不是了。
表情符号和重音字母:读者看是一个,程序看是多个
家庭表情 👨👩👧 实际上是三个表情,中间用不可见的连接符拼起来。它在 JavaScript 里的 .length 是 8,UTF-8 下占 18 个字节,而读者看到的是一个符号。带重音的字母,可以存成一个码点,也可以存成基础字母加组合符号,两种在屏幕上看起来完全一样。
计数工具可以按「用户感知的字符」(字素)来统计人眼看到的数量。字数统计工具就是这样做的,所以一个表情符号或带重音的字母算一个字符。表格软件里的长度公式和很多脚本数的是编码单元,因此一个单元格里放三个表情,可能报出远大于 3 的数字。
如果平台的算法和你看到的不同,以平台的规则为准。比如 X 把每个汉字按两个字符加权,一个「每个可见字符算一个」的计数器,读数就会比平台的低。任何限制都应当留出余量。
词数:空格并不总是边界
最简单的词数统计按空格切分。这对一句英文有效,到了以下情形就失灵:
don't应该算一个词,而简单地按标点切会得到两个。state-of-the-art这样带连字符的短语,大多数读者当作一个词,而在连字符处断开的分词器会得到四个。这个工具会把「两侧都有单词的连字符」重新接起来,算作一个。- 中文和日文没有空格。
你好,世界里根本没有用空格隔开的词。
对中文和日文,工具使用浏览器自带的分词器,按词典切分。这是一种近似:不同浏览器、不同版本对同一句话的切分可能略有差别,所以含中日文的文本,词数可能在不同浏览器之间有小幅变动。这也是为什么工具把「中日韩文字数」作为单独的精确数字列在旁边。统计中文时,报字数请用这个数。
中文字数:编辑说的「字数」是哪一种
中文出版语境里「字数」通常指字,但细节取决于对方的要求:有的要求包含标点,有的不包含;有的把数字和英文字母也逐个计入。按规格交稿之前,先问清楚。
在这个工具里,总字符数包括标点、数字和字母。中日韩文字数只统计汉字、平假名、片假名和谚文,所以全角标点「,」「。」包含在前一个数里,不在后一个数里。用前者减后者,可以快速知道文本里标点和拉丁字符占多少。
文字处理软件也有自己的规则。Microsoft Word 对东亚文字的计数方式与用空格分隔的词不同,因此中英混排的文档在 Word 里和浏览器里读出来可能不同。数字很重要的时候,用接收方使用的那个工具。
短信:160、70,以及超出之后会怎样
一条短信可以容纳 160 个 GSM-7 字符,如果内容需要 UCS-2 编码,则只有 70 个。只要出现一个 GSM-7 字符集以外的字符,整条短信就会改用 UCS-2。汉字会触发这一点,大多数表情符号和排版用的弯引号也会。更长的短信会被拆成串联的分段,每段 GSM-7 为 153 个字符,UCS-2 为 67 个字符,因为拼接用的头信息占了位置。
另外两点:
- GSM-7 里有些字符占两个位置,包括
€、[、]、{、}。 - UCS-2 短信里的一个表情符号占 70 个位置里的两个,因为它存成一对编码单元。
工具的限制进度条有 160 的选项和一个自定义输入框,每个可见字符算一个,它不会检测你的短信会使用哪种编码。中文短信请把自定义上限设成 70;一条含有零星表情或弯撇号的英文短信,要按较短的上限来算。
标题、描述和推文的限制
| 限制 | 性质 | 注意 |
|---|---|---|
| 页面标题 title,约 60 | 搜索结果里的经验值 | 实际按像素宽度截断,所以 60 只是估计 |
| meta 描述,约 160 | 显示惯例 | 搜索引擎可能完全换成另一段摘要 |
| X 推文,280 | 硬性上限 | 有加权:汉字算两个,链接有固定的占用 |
| 短信单条,160 / 70 | 计费与投递单位 | 取决于编码,见上文 |
工具提供 60、160、280 三个预设和一个自定义选项。前两个是经验规则,所以进度条停在线下一点点,只能当作大致通过;重要的标题,用按像素宽度的预览来确认。X 的 280 是平台自己计算的,以它自己的发布框为准。中文标题尤其要注意:一个全角汉字的宽度大约是两个拉丁字母,所以中文标题按字符数算不到 60,就可能已经被截断。
阅读时间只是平均值
工具估算阅读时间时,有空格的语言按每分钟 238 词,中日韩文字按每分钟 400 字;朗读时间按每分钟 130 词、220 字。混合文本会把两部分相加。这些数字适合做规划:密集的技术文章读得慢,扫一眼的清单读得快。
字节数:存数据库时才重要
工具还会显示 UTF-8 体积。一个汉字在 UTF-8 里占三个字节,一个英文字母占一个,表情符号一般占四个。如果你要把文本存进一个限制为字节数的字段,比如某些数据库列定义成多少字节,那么 100 字的中文就要占 300 字节左右,而不是 100。这时用字节数判断,才不会存入时被截断。
到底用哪个数字
- 满足某个平台的限制:用该平台自己的计数器,其他工具的数都只当作估计。
- 报中文或日文的篇幅:用中日韩文字数。
- 写有空格分词的语言:长度看词数,填字段看含空格的字符数。
- 把文本存进数据库的列:看 UTF-8 的字节数,因为列限制常常以字节定义,而一个汉字占三个字节。