Emoji 相关工具合集

Emoji 工具合集:整理常用 emoji 的名称、Unicode 码点与含义分类,说明肤色修饰符、ZWJ 组合序列与地区旗帜的码位构成,并给出跨平台显示不一致的根因与数据库字段长度陷阱,附 emoji 挑选器、Unicode 转义与字符统计入口。适合在文案与代码中正确使用 emoji。

Emoji 已成为界面与文案中的常规元素,但它的 Unicode 结构远比看起来复杂。

常见方案对照

维度基础 emojiZWJ 组合序列
占码位数通常 1–2 个3–11 个
视觉数量1 个1 个
可拆开搜索可不可
复制到旧系统一般可用可能显示为多个字符或方框
数据库字段长度按字符数即可需按码位预留,否则被截断
正则匹配按码位匹配需整体匹配或用变长匹配
平台差异字体不同形状不同字体不支持时降级显示
典型例子点赞手势 U+1F44D家庭组合 = 3 码位 + 2 个 ZWJ

边界条件

  • ZWJ 序列的长度不能用普通 str.length 判断,数据库字段要按码位预留空间。
  • 肤色修饰符(U+1F3FB–U+1F3FF)叠加在基础 emoji 上,部分旧系统显示为方框。
  • 地区旗帜由两个「区域指示符」码位(U+1F1E6–U+1F1FF)合成,不是单一码位。
  • 同一个 emoji 可能有多个码位序列(单码位、带变体选择符 U+FE0F),视觉相同但字符串不相等。

常见坑

  • 按 str.length 截断字符串,把一个家庭 emoji 切成了两半。
  • 数据库 varchar(10) 存组合序列,插入时被静默截断。
  • 在不支持 ZWJ 的平台发家庭 emoji,对方看到一串无关字符。
  • 比较两个 emoji 字符串是否相等时忽略变体选择符,导致误判为不同。

相关工具

常见问题

为什么同一个 emoji 在不同平台显示不一样?

因为字体不同。每个平台(Windows / macOS / iOS / Android)自带不同的 emoji 字体,同一码位渲染出的图形可以完全不同。想要跨平台一致,只能用**图像**(图标或图片)而非 emoji 字符。另外肤色修饰符叠加在基础 emoji 上,在部分旧系统上会显示成方框。

ZWJ 序列是什么,为什么它会影响字符串长度?

ZWJ(Zero Width Joiner,U+200D)用来把多个码位**组合成一个** emoji。例如家庭类 emoji 用 ZWJ 把「男人 + 女人 + 女孩」连起来,整体显示为一个人物。因此它的**字符串长度大于视觉长度**——一个看起来 1 个字符的 emoji 可能占 7 个码位。做长度校验、截断或数据库字段长度限制时必须按码位计算。