字符串长度统计工具

一次给出 Unicode 字符数、UTF-8 字节数、去空白字符数、行数、单词数、中文字符数与最长行字符数,并可对照七种常见平台的长度上限。代理对按码点算一个字,字节数由浏览器编码器精确得出。

44 字符 / 56 字节 / 4 行 / 8 词 / 未选上限
Unicode 字符数44
UTF-8 字节数56
去空白字符数36
行数4
单词数8
中文字符数6
最长行字符数15
目标上限差额未选择
行号行内容字符数字节数
1Hello World1111
2第二行 second line1521
3(空行)00
4第四行 with spaces1521

默认示例为四行文本:Hello World、第二行 second line、一个空行、第四行 with spaces,合计 41 个字符与 53 个字节,再加 3 个换行符得到全篇 44 字符 / 56 字节。

使用方法

  1. 「待统计文本」里已经放着四行示例:Hello World、第二行 second line、一个空行、第四行 with spaces。示例由页面直接给出,不必先粘贴内容。
  2. 把光标放进文本框,按 Ctrl + Enter(苹果键盘是 Cmd + Enter)触发统计;输入过程中统计值同步刷新。
  3. 「目标长度上限」下拉提供七种取值:不比较、微博(早期)140、X / Twitter 280、短信 GSM 单条 160、短信中文单条 70、Meta description 建议 155、SEO Title 建议 60。
  4. 选了上限之后,结果区会多出一行「还差 N 字符」或「已超 N 字符」。比较的基准是 Unicode 字符数而不是字节数,因为各平台的字数提示通常按字符给出。
  5. 「复制结果」把七项口径打包成一段文字放进剪贴板,「复制对照表」复制逐行明细的制表符表格,「导出 CSV」带 UTF-8 字节序标记,表格软件里不会乱码。
  6. 逐行明细超过六行会自动出现「加载更多」;「重置」把文本框恢复成默认四行示例,上限恢复成不比较。

这个工具能解决什么问题

本页要解决的是「这段文本到底有多长」这个看着一句话就能答完、实际有两个答案的问题。同一段示例文本,按 Unicode 字符数是 44,按 UTF-8 字节数是 56;页面上的计数框多半按前者,数据库字段与接口限额多半按后者,两边不一致时,超长常常要到提交那一刻才被发现。

第二个作用是给有硬门槛的内容做预检。社交平台正文、短信单条长度、搜索结果标题与摘要的建议字数各不相同。与其把文本粘过去被截断后回头删字,不如先在这里选一个目标上限,直接看到离门槛还差几个字。

第三个作用是代理对的判定。表情符号与一部分扩展区汉字在 JavaScript 字符串里占两个 UTF-16 码元,用取长度的方式读出来会比肉眼多一个字;本页一律按 Array.from 拆字,这类字符记一个,与屏幕上看到的一致。

它和站内其它文字类工具的分工也不同:字数统计工具侧重成篇文稿的规模,词频统计工具关心词表分布,而本页面向开发场景,把字符、字节、行数、单词数并排给出。

这个工具在本站也叫 `字符串长度统计`。

字符、字节与行数的统计口径

七项口径全部写在页面上,逐条说明如下:

为什么同一段文本会给出两个数。示例文本 44 个字符对应 56 个字节,差的 12 字节恰好来自 6 个汉字:每个汉字在 UTF-8 里占 3 字节,若它属于 ASCII 则只占 1 字节,一个字多出 2 字节,6 个字多出 12 字节。反过来,纯 ASCII 的 Hello World 是 11 个字符也是 11 个字节,两个数相等。数据库字段常写的 VARCHAR(255) 限制的是字节,用 UTF-8 存中文只能放 85 个字,按字符数去填就会截断或报错。

为什么不用取长度的方式数字符。JavaScript 的字符串以 UTF-16 码元为单位,代理对由两个码元组成,直接取长度会得到 2,而屏幕上只有一个字。Array.from 以码点为步长,得出的字数才与肉眼一致。这也解释了为什么同一个符号,有的编辑器里显示一个字、有的显示两个字。

为什么字节数交给浏览器编码器。自己按「中文 3 字节、英文 1 字节」估算只能覆盖基本平面里的常见字符;UTF-8 是变长编码,2 到 4 字节的区间各有大量字符分布,估算办法必然出错。编码器的实现按规范逐码点推进,不存在估算误差。

为什么行数要单独定义。按换行符切分时,末尾多敲一个回车就多出一个空行,这与编辑器里的光标行号一致,与「非空行数」不是一回事。本页不预处理回车换行,文本里的每个字符都会如实计入。

完整示例(数值仅作演示)

示例条件:文本框保持默认四行内容,目标上限选「不比较」。下列数值全部由本页自己的算法算出,与页面默认输出逐项一致:

逐行拆开看:第一行 Hello World 是 11 字符 / 11 字节;第二行「第二行 second line」是 15 字符 / 21 字节;第三行空行是 0 字符 / 0 字节;第四行「第四行 with spaces」是 15 字符 / 21 字节。四行相加为 41 字符 / 53 字节,再加 3 个换行符,正好是全篇的 44 字符 / 56 字节;15 字符的最长行由第二行与第四行并列保持。

把目标上限换成 SEO Title 建议的 60 字符,结果区会给出「还差 16 字符」;换成微博早期的 140 字符则是「还差 96 字符」。判断依据始终是字符数 44 而不是字节数 56,超过后会改成「已超 N 字符」。

单位换算的直观对照:3 个中文字符占 9 字节,11 个英文字符占 11 字节,单个表情符号占 4 字节而字符数只记 1。上述数值均为演示。

常见平台的长度上限对照表

下表列出十二个常见场景的字符上限。它们的口径并不统一:社交平台会把链接折算成固定长度计入,短信按字符集切换单条容量,搜索引擎给的是「展示得下」的建议值而非硬限制。

平台 / 场景字符上限说明
微博(早期)140早期单条正文的上限
X / Twitter280单条推文字符上限
短信 GSM 单条160纯 GSM 字符集下的单条容量
短信中文单条70中文按 UCS-2 计的单条容量
Meta description 建议155搜索摘要的建议长度
SEO Title 建议60搜索结果标题的建议长度
Instagram 简介150个人简介的字数上限
YouTube 标题100视频标题的字符上限
淘宝商品标题60商品标题的字数上限
亚马逊标题建议200商品标题的建议长度
抖音文案1000单条文案的字数上限
知乎标题50问题与文章标题的字数上限

短信那两行最容易被误读:160 与 70 不是两套换算结果,而是两种编码方案——纯 GSM 字符按 7 位打包成 160,一旦混进中文就整条切到 UCS-2,容量掉到 70。只要这一条里出现一个非 GSM 字符,整条短信就按 70 个字符的容量来算。

下表按 UTF-8 编码给出三种典型字符的单位代价,用来快速判断「我把这段文本塞进某个字段会不会爆」:

文本样本Unicode 字符数UTF-8 字节数每字符均值
中文 3 字393.00
英文 11 字11111.00
表情符号 1 个144.00

结果边界、舍入与适用说明

常见问题

同一段文本为什么给出两个不一样的数?

因为「字符数」与「字节数」是两个口径。示例文本 44 个字符对应 56 个字节,差的 12 字节来自 6 个汉字:每个汉字在 UTF-8 里是 3 字节,比 ASCII 的 1 字节多 2 字节。判长度时要先确认对方卡的是哪一种。

表情符号和生僻字为什么算一个字?

它们在 JavaScript 字符串里是代理对,占两个 UTF-16 码元,直接取长度会得到 2。本页用 Array.from 按码点拆分,一个字就是一个字,与屏幕上看到的保持一致。

为什么示例文本里有空行也算一行?

行数按换行符切分,并且最后一行不带换行也算一行。示例共有 3 个换行符却报 4 行,就是因为第三段是一个空行、它本身占据一行。这与编辑器里光标所在的行号一致。

短信的上限到底按 160 还是 70?

看字符集:纯 GSM 字符时单条 160,一旦混进中文等非 GSM 字符,整条改用 UCS-2 编码,容量降到 70。这不是换算误差,而是两条互不兼容的编码路径,页面把两者都列出来就是这个原因。

数据库字段写 VARCHAR(255),能放几个汉字?

这个长度限制的是字节而不是字符。按 UTF-8 计算,每个常用汉字占 3 字节,255 字节只能放 85 个汉字。按字符数填到 255 会在入库时截断或报错。

文本里带着 HTML 标签,按什么算?

按原样文本逐字符统计,不做标签剥离。要把标签排除在外,请先去掉标签再粘贴进来,否则标签本身也会计入字符数与字节数。

这个工具免费吗?

免费,无需注册即可使用。

输入的数据安全吗?

安全。计算在当前浏览器本地完成,不会上传输入内容。

相关工具