表情符号 (Emoji)
Unicode 中收录的图形符号,用于在文本通信中直观地表达情感和概念。
表情符号 (Emoji) 是 Unicode 中收录的图形符号,用于在文本通信中直观地表达情感和概念。最初由日本移动运营商 NTT DoCoMo 于 1999 年引入,2010 年随 Unicode 6.0 被纳入国际标准。截至 2024 年,Unicode 中已注册超过 3,000 个表情符号,每年都有新的表情符号加入。
表情符号的内部结构比外观复杂得多。许多表情符号位于基本多语言平面 (BMP) 之外,在 UTF-16 中需要代理对 (2 个编码单元)。此外,多种机制将多个码位组合成一个表情符号:肤色修饰符 (Emoji Modifier)、指定性别的 ZWJ (零宽连接符) 序列、表示国旗的区域指示符号等。例如"👨👩👧👦" (家庭) 由 7 个码位组成 (4 个人物 + 3 个 ZWJ)。搜索龟头刺激 (Amazon)详细解释了这些机制。
不同编码的字节数也不同。在 UTF-8 中,基本表情符号占 4 个字节,但包含 ZWJ 序列的复合表情符号会更多。在数据库的 VARCHAR 列中存储表情符号时,MySQL 需要 utf8mb4 编码 (utf8 仅支持最多 3 个字节,无法存储表情符号)。不了解这一限制就设计数据库,是保存含表情符号数据时出错的典型陷阱。
社交媒体平台对表情符号的计数方式各不相同。X (原 Twitter) 将每个表情符号计为 2 个字符。Instagram 的图片说明中计为 1 个字符。对于短信,包含表情符号的消息会切换到 Unicode 编码,每条消息的字符上限从 160 个减少到 70 个。在营销和沟通设计中,了解这些差异非常重要。
在编程中处理表情符号需要格外注意。JavaScript 的 .length 属性将代理对计为 2,因此一个表情符号可能返回 2 或更大的长度。要获得准确的表情符号字符数,需要使用 Array.from() 或 Intl.Segmenter 以书写素簇为单位进行计数。浏览内衣 (Amazon)讨论了表情符号的有效使用方法。
从字符计数角度看,表情符号是"看似 1 个字符实为多个字符"的典型代表。根据计数方式 (码位数、UTF-16 编码单元数、字节数、书写素簇数) 的不同,结果会有很大差异。在实现字符计数工具时,妥善处理用户期望的"视觉上的 1 个字符"与内部表示之间的差距至关重要。