表情符号算几个字? - 一个表情不一定等于一个字的原因
一个笑脸算 1 个字吗? 那家庭表情呢? 其实,看起来是一个表情符号,内部可能是由多个字符组合而成的。你有没有在 X (原 Twitter) 上遇到过"明明应该还能再打一个字,却打不进去"的情况?
表情符号的字数计算
| 表情符号 | 外观 | Unicode 字数 | UTF-16 长度 | UTF-8 字节数 |
|---|---|---|---|---|
| 😀 | 1 个 | 1 字 | 2 | 4 字节 |
| 👍 | 1 个 | 1 字 | 2 | 4 字节 |
| 👍🏽 | 1 个 | 2 字 | 4 | 8 字节 |
| 👨👩👧👦 | 1 个 | 7 字 | 11 | 25 字节 |
| 🏳️🌈 | 1 个 | 4 字 | 6 | 14 字节 |
| 🇯🇵 | 1 个 | 2 字 | 4 | 8 字节 |
家庭表情看起来是 1 个,但内部其实是"男性 + 连接符 + 女性 + 连接符 + 女孩 + 连接符 + 男孩"共 7 个字符组成的。
为什么表情符号的字数各不相同?
| 机制 | 说明 | 示例 |
|---|---|---|
| 基本表情 | 1 个码位 = 1 字 | 😀 (U+1F600) |
| 肤色 | 基本表情 + 肤色修饰符 = 2 字 | 👍🏽 = 👍 + 🏽 |
| ZWJ 组合 | 用不可见字符把多个表情连起来 | 👨👩👧👦 = 👨 + ZWJ + 👩 + ZWJ + 👧 + ZWJ + 👦 |
| 国旗 | 2 个地区指示符的组合 | 🇯🇵 = 🇯 + 🇵 |
ZWJ 是"Zero Width Joiner"(零宽连接符) 的缩写,它在屏幕上看不见,但会被计入字数。
社交平台上表情符号的字数计算
| 平台 | 😀 的计算 | 👨👩👧👦 的计算 | 计算方式 |
|---|---|---|---|
| X (原 Twitter) | 算 2 字 | 算 7-11 字 | 独特的加权方式 |
| 算 1 字 | 算 1 字 | 按外观的表情数 | |
| LINE | 算 1 字 | 算 1 字 | 按外观的表情数 |
| 短信 (SMS) | 1 个表情就切换到 70 字限制 | 同左 | 编码方式切换 |
在 X 上,一个表情符号算 2 个字。在 140 字的限制下大量使用表情,能写文字的空间就会越来越少。正如 X 字数限制的历史中提到的,表情符号的处理方式正是字数计算复杂性的缩影。
短信与表情符号的意外关系
短信 (SMS) 只要加入一个表情符号,字数限制就会发生巨大变化。
| 条件 | 每条短信的字数 | 编码方式 |
|---|---|---|
| 仅英文数字 | 160 字 | GSM-7 (7 位) |
| 仅中日文 | 70 字 | UCS-2 (16 位) |
| 包含表情符号 | 70 字 | 切换为 UCS-2 |
英文短信每条可以发 160 字,但只要加入一个表情符号,就会切换到 UCS-2 编码,变成只能发 70 字。仅仅一个表情,就损失了 90 字的容量。
表情符号的数量还在不断增加
| 年份 | Unicode 版本 | 表情总数 | 新增的主要表情 |
|---|---|---|---|
| 2010 | 6.0 | 约 720 | 基本的脸、动物、食物 |
| 2015 | 8.0 | 约 1,620 | 肤色变体 |
| 2020 | 13.0 | 约 3,300 | 忍者、珍珠奶茶、海狸 |
| 2024 | 16.0 | 约 3,790 | 坚果、指纹、泼溅 |
表情符号每年都在增加,截至 2024 年约有 3,790 种。最早的手机表情 (1999 年,NTT DoCoMo) 只有 176 种。25 年间增长了 20 倍以上。
编程中表情符号的字数
在编程中正确计算表情符号的字数,其实是一个非常棘手的问题。
| 编程语言 | "👨👩👧👦".length 的结果 | 原因 |
|---|---|---|
| JavaScript | 11 | UTF-16 代码单元数 |
| Python | 7 | Unicode 码位数 |
| Swift | 1 | 字素簇数 (外观上的字数) |
同一个表情符号,不同编程语言计算出的"长度"分别是 1、7、11,结果完全不同。作为字数和字节数区别的进阶问题,表情符号是最复杂的案例之一。
关于表情符号和 Unicode 的书籍,也可以在 Amazon 上找到。