Emoji 表情符号的字数计算 - 看似 1 个字符实为多个字符的原理

7 分钟阅读

表情符号已成为数字沟通中不可或缺的元素,但其字符计数方式往往出人意料。看似 1 个字符的表情符号,在内部可能被计为多个字符,这在社交媒体发帖和编程中都会产生影响。理解Unicode 编程的基础知识,有助于准确处理表情符号。

表情符号的 Unicode 结构

表情符号在 Unicode 中的表示方式比想象的要复杂得多。最基本的表情符号 (如 😀 U+1F600) 是单个码点,但许多常见表情符号由多个码点组合而成。

表情符号外观码点数UTF-8 字节数UTF-16 代码单元
笑脸😀142 (代理对)
带肤色的挥手👋🏽284
家庭👨‍👩‍👧‍👦72511
国旗 (中国)🇨🇳284
彩虹旗🏳️‍🌈4147

为什么 1 个表情符号会被计为多个字符

表情符号的字符计数取决于使用的计数方法。主要有三种计数方式:

各社交媒体平台的表情符号计数方式

平台计数方式😀 的计数👨‍👩‍👧‍👦 的计数
X (Twitter)加权字符11
Instagram字素簇11
DiscordUnicode 码点17
FacebookUTF-16 代码单元211
LINEUTF-16 代码单元211

X (Twitter) 和 Instagram 对表情符号最为友好,无论多复杂的组合表情符号都只计为 1 个字符。而 Discord 按码点计数,Facebook 和 LINE 按 UTF-16 代码单元计数,复杂表情符号会消耗大量字数。

零宽连接符 (ZWJ) 序列的原理

许多复杂表情符号使用零宽连接符 (ZWJ, U+200D) 将多个表情符号连接成一个视觉字符。

ZWJ 序列的支持取决于操作系统和应用程序。不支持的环境中,组合表情符号会显示为多个独立的表情符号。

编程中的表情符号处理

在编程中正确处理表情符号需要注意以下几点:

表情符号版本与兼容性

Unicode 联盟每年发布新的表情符号。字符编码指南中也详细介绍了这一演进过程。新表情符号在旧系统上可能显示为方框 (□) 或问号。在设计面向广泛用户的应用时,应考虑表情符号的兼容性。

总结

表情符号的字符计数远比表面看起来复杂。同一个表情符号在不同平台和编程语言中的计数可能完全不同。理解 Unicode 码点、UTF-16 代码单元和字素簇这三种计数方式的区别,是准确处理表情符号的关键。使用字符计数器可以实时确认包含表情符号的文本的准确字符数。