最后更新:

表情符号算几个字?- 一个表情不一定等于一个字的原因

约 5 分钟阅读

一个笑脸算 1 个字吗?那家庭表情呢?其实,看起来是一个表情符号,内部可能是由多个字符组合而成的。你有没有在 X (原 Twitter) 上遇到过"明明应该还能再打一个字,却打不进去"的情况?

表情符号的字数计算

表情符号外观Unicode 字数UTF-16 长度UTF-8 字节数
😀1 个1 字24 字节
👍1 个1 字24 字节
👍🏽1 个2 字48 字节
👨‍👩‍👧‍👦1 个7 字1125 字节
🏳️‍🌈1 个4 字614 字节
🇯🇵1 个2 字48 字节

家庭表情看起来是 1 个,但内部其实是"男性 + 连接符 + 女性 + 连接符 + 女孩 + 连接符 + 男孩"共 7 个字符组成的。

为什么表情符号的字数各不相同?

机制说明示例
基本表情1 个码位 = 1 字😀 (U+1F600)
肤色基本表情 + 肤色修饰符 = 2 字👍🏽 = 👍 + 🏽
ZWJ 组合用不可见字符把多个表情连起来👨‍👩‍👧‍👦 = 👨 + ZWJ + 👩 + ZWJ + 👧 + ZWJ + 👦
国旗2 个地区指示符的组合🇯🇵 = 🇯 + 🇵

ZWJ 是"Zero Width Joiner"(零宽连接符) 的缩写,它在屏幕上看不见,但会被计入字数。

社交平台上表情符号的字数计算

平台😀 的计算👨‍👩‍👧‍👦 的计算计算方式
X (原 Twitter)算 2 字算 2 字所有表情一律按权重 2 计算
短信 (SMS)1 个表情就切换到 70 字限制同左编码方式切换

X 的帖子上限是 280 个权重单位,每个表情符号消耗权重 2。半角英文数字 1 个字符是权重 1,所以一个表情就占掉相当于 2 个英文字符的空间。而像中文、日文这样 1 个字符被定为权重 2 的文字,一个表情占的就和 1 个汉字相同 (全部用中文书写时实际上限是 140 字)。这种权重方式不看内部的码位数,所以像 👨‍👩‍👧‍👦 这样的组合表情消耗的也还是 2。正如 X 字数限制的历史中提到的,表情符号的处理方式正是字数计算复杂性的缩影。

也有像 Instagram、LINE 这样不公布计数方式的服务。没有官方说明时,最可靠的办法是在输入框里加一个表情,观察剩余字数的减少量。看起来只有一个、内部却由多个字符组成的表情,减掉的数量可能比预想的多。

短信与表情符号的意外关系

短信 (SMS) 只要加入一个表情符号,字数限制就会发生巨大变化。

条件每条短信的字数编码方式
仅英文数字160 字GSM-7 (7 位)
仅中日文70 字UCS-2 (16 位)
包含表情符号70 字切换为 UCS-2

英文短信每条可以发 160 字,但只要加入一个表情符号,就会切换到 UCS-2 编码,变成只能发 70 字。仅仅一个表情,就损失了 90 字的容量。

这个 70 指的是一条短信能装下的 16 位单位的个数。多数表情符号超出 16 位、一个要占用 2 个单位,所以只发表情的话一条短信只能装下 35 个左右。带肤色或用 ZWJ 组合的表情消耗的单位更多,👨‍👩‍👧‍👦 就要占 11 个单位,一个表情占掉相当于 11 个汉字的空间。

表情符号的数量还在不断增加

年份Unicode 版本表情总数新增的主要表情
20106.0约 720基本的脸、动物、食物
20158.0约 1,630肤色变体
202013.0约 3,300忍者、珍珠奶茶、海狸
202416.03,790指纹、竖琴、泼溅
202517.03,953虎鲸、长号、宝箱

上表的件数按 Unicode 官方发布的表情数据文件的口径统计,计数对象是包含全部显示指定的形式 (完全限定) 的序列,再加上肤色 5 种和发型 4 种的构成要素。口径不同,总数就会不同,如果和其他资料对不上,请先确认统计基准。

截至 2026 年 8 月,最新版本是 17.0,共 3,953 件,比上一版 16.0 增加了 163 件。作为手机表情广为人知的 1999 年 NTT DoCoMo (i-mode) 表情有 176 种,在那之前还有 1997 年 J-Phone 的约 90 种实现。以 i-mode 的 176 种为起点,26 年间增长了 20 倍以上。

编程中表情符号的字数

在编程中正确计算表情符号的字数,其实是一个非常棘手的问题。

编程语言"👨‍👩‍👧‍👦".length 的结果原因
JavaScript11UTF-16 代码单元数
Python7Unicode 码位数
Swift1字素簇数 (外观上的字数)

同一个表情符号,不同编程语言计算出的"长度"分别是 1、7、11,结果完全不同。作为字数和字节数区别的进阶问题,表情符号是最复杂的案例之一。

分享这篇文章