工具介绍
对于纯 ASCII 文本(英文字母、数字、基本标点),字符数和字节数是相同的——每个字符在 UTF-8 中都恰好占用一个字节。一旦文本包含带重音符号的字母、中文/日文/韩文字符、西里尔文、阿拉伯文、表情符号或其他大多数非 ASCII 字符,这个规律就不再成立:一个字符在 UTF-8 中可能占用 2、3 或 4 个字节,在 UTF-16 中占用 2 或 4 个字节。
这在系统限制的是字节数而不是字符数时非常重要——短信、数据库列大小、API 载荷限制,以及一些社交平台都是按字节而不是字符计量的,所以同一段文本可能因为使用了不同的语言或符号而悄悄超出限制。
为什么使用它?
- 微信朋友圈或公众号后台某些字段限制的是字节数而不是字符数,你的签名里带了个表情符号——先在这里输入一下,看看真实字节开销,免得表单默默截断。
- 数据库字段底层其实是按字节定义的 VARCHAR,一个「看起来很短」的中文商品标题却总是被拒绝——粘贴进来就能看出,同样字数的中文标题占用的字节数是英文标题的三倍左右。
- 群发短信通知前想估算一下会占多少条,运营商是按字节计费和拆分短信段的——先在这里查一下 UTF-8/UTF-16 字节数,比直接群发后收到超额账单靠谱得多。
- 接口返回一个「payload too large」的报错,字段有严格的字节长度校验,但那段文字在编辑器里看着明明不长——粘过来就能看清这段字符串到底占了多少字节。
- 想弄清楚为什么同一句话用中文写比用英文写占用的存储空间更大——分别输入两个版本,就能直观看到 UTF-8 字节数在中日韩文字上明显跳高。
- 想确认某个校验规则是不是把用户名里的一个表情符号错误地算成了两个字符——这个工具按人眼实际看到的方式计数,能帮你判断问题出在哪一边。
使用方法
- 在输入框中输入或粘贴文本。
- 查看下方的字符数、UTF-8 字节数和 UTF-16 字节数——它们会随着你的输入实时更新。
示例
输入
Hello, 世界! 🌍输出
12 个字符,19 个 UTF-8 字节,26 个 UTF-16 字节ASCII 部分(「Hello, 」和「! 」)在 UTF-8 中每个字符占 1 字节。每个中文字符占 3 字节,表情符号占 4 字节——这就是为什么字节数明显高于字符数。
按字符类型划分的 UTF-8 字节开销
下表列出了不同字符类别典型的 UTF-8 字节开销——在把整段多语言文本粘贴进去之前,可以先用它大致估算实际占用的空间。
| 字符类型 | 示例 | UTF-8 字节数 | UTF-16 字节数 |
|---|---|---|---|
| ASCII 字母/数字 | A, 7 | 1 | 2 |
| 带重音的拉丁字母 (é, ñ, ü) | é | 2 | 2 |
| 西里尔文 / 希腊文 / 希伯来文 / 阿拉伯文 | д, α, א | 2 | 2 |
| 中日韩文字 | 世 | 3 | 2 |
| 大多数表情符号 (BMP 之外) | 🌍 | 4 | 4 |
常见用途
- 检查多语言产品描述是否能放进按字节长度而非字符数定义的数据库列。
- 估算短信分段数,因为短信是按字节计费和拆分的,非拉丁文字使用不同的单段限制。
- 在提交前验证 API 载荷或表单字段是否符合基于字节的大小限制。
- 理解为什么一段「看起来很短」的字符串会被具有字节长度校验的系统拒绝。
常见问题
为什么字符数和字节数不一致?
Unicode 文本以字节形式存储,每个字符需要多少字节取决于编码方式和字符本身。在 UTF-8 中,ASCII 字符占 1 字节,大多数带重音符号的拉丁字母以及西里尔文/希腊文/希伯来文/阿拉伯文占 2 字节,大多数中日韩字符占 3 字节,表情符号通常占 4 字节。字符数只是单纯地统计符号数量,不关心它们如何存储。
对于有字节限制的字段,我应该参考哪个字节数?
使用系统实际存储或传输文本时采用的编码——大多数现代 Web API、数据库和文件都使用 UTF-8,所以 UTF-8 字节数通常才是相关的数字。一些较老的系统(比如 Windows/Java 内部的字符串处理)使用 UTF-16。
这个工具能正确统计表情符号吗?
可以。许多表情符号在内部以一对 UTF-16「代理」码元存储,朴素的计数方法会把它们计为 2 个字符。这个工具正确地统计 Unicode 码点,所以一个表情符号会被计为 1 个字符,与人实际看到的字符数一致。
这和字数统计工具是一回事吗?
不是——字数统计工具关注的是写作中的单词数和句子数。这个工具专门统计字节大小与字符数的对比,关注的是技术限制而不是字数要求。
我的文本会被上传吗?
不会。统计在你的浏览器中使用 JavaScript 内置的文本编码器本地完成,不会发送到任何服务器。
为什么同一个字符在 UTF-8 和 UTF-16 下占用的字节数不一样?
两种编码把码点映射为字节的规则完全不同。UTF-8 根据字符不同使用 1 到 4 个字节,为了让 ASCII 仍然只占 1 字节做了优化;UTF-16 大多数字符占 2 字节,只有基本多语言平面之外的字符(比如大多数表情符号)才占 4 字节——所以一个汉字在 UTF-8 中是 3 字节,但在 UTF-16 中只有 2 字节,而表情符号在两种编码下都是 4 字节。
带肤色或家庭组合的表情符号(由多个字符拼接而成)能被正确统计吗?
这个工具统计的是 Unicode 码点,所以由多个码点通过零宽连接符拼接而成的组合表情符号(比如家庭表情)会被算作好几个字符,而不是一个——这和它底层实际的编码方式一致,即使它显示出来只是一个图形。
对于纯英文文本,UTF-8 字节数和字符数有什么区别?
对于只用 ASCII 字母、数字、空格和基本标点的标准英文文本来说,两者完全一致——每个字符在 UTF-8 中都恰好占 1 字节。差异只有在加入重音字母、符号或非拉丁文字之后才会出现。
能用这个工具精确核对微博或短信的字数限制吗?
这个工具给出的是原始的字符数和字节数,是这些限制的计算基础,但有些平台会有自己的加权规则(比如把某些表情符号或链接固定算作若干字符,不管实际长度)——具体边界情况建议参考平台自己的规则,这个工具主要帮你理解底层的字节开销。