首页/开发/正则与编码速查/emoji 编码构成与码点范围

emoji 编码构成与码点范围

emoji 是被吸收进 Unicode 的普通字符,主要位于 U+1F300-U+1FAFF 等区块;BMP 内为 3 字节(UTF-8)或 1 个编码单元(UTF-16),增补平面为 4 字节或 2 个编码单元,存储需 utf8mb4 级别的支持。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌​‌‌‌‌​‌‌​‌​‌​​‌‌​‌​​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​​​‌​​‌‌​​​​‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

emoji 的码位与编码

emoji 没有独立编码体系,它们就是 Unicode 码位:早期来自日本运营商的私有映射,Unicode 6.0 起被正式收录并持续增补。码位集中在补充符号与象形文字区(U+1F300 以上),也有一部分在基本平面内(如杂项符号区)。编码代价因此分两类:基本平面内的 emoji 在 UTF-8 下 3 字节、UTF-16 下 1 个编码单元;增补平面的 emoji 是 4 字节、2 个编码单元(代理对)。显示外观由字体与平台决定,同一码位在不同系统上样式不同。

基本信息

主要码位区间U+1F300-U+1FAFF 等区块,部分在基本平面(U+2600 附近)
UTF-8 长度基本平面 3 字节 / 增补平面 4 字节
UTF-16 长度基本平面 1 个编码单元 / 增补平面 2 个(代理对)
呈现选择变体选择符 U+FE0F 表示彩色的 emoji 呈现,U+FE0E 表示文本呈现
肤色U+1F3FB-U+1F3FF 作为修饰符加在基础 emoji 之后
存储要求数据库与列需支持 4 字节字符(如 utf8mb4)

典型使用场景

  • 输入校验:判断内容是否含 emoji,或按业务限制 emoji 使用范围
  • 存储与迁移:确认数据库、列、连接都能保存 4 字节字符
  • 长度统计:昵称、评论的字数限制需要按字形簇而非码点或字节
  • 显示与字体:同一 emoji 在不同平台样式不同,界面对齐与字号需实测
  • 数据清洗:emoji 常夹带变体选择符与零宽连接符,过滤规则要按序列处理

码位与字节观察

码位与字节观察
python -c "e='\U0001F600'; print(hex(ord(e)), len(e.encode('utf-8')), len(e.encode('utf-16-le'))//2)"   # 0x1f600 4 字节 / 2 个编码单元
python -c "print(hex(ord('\u2764')), hex(ord('\ufe0f')))"     # 心形码位 + 变体选择符
python -c "print([hex(ord(c)) for c in '\U0001F44D\U0001F3FD'])"  # 拇指 + 肤色修饰符
python -c "print('\U0001F600'.encode('utf-8'))"                 # b'\xf0\x9f\x98\x80'
# 粗略判断是否落在常用 emoji 区间(工程上建议用官方 emoji 数据或成熟库)
python -c "print(0x1F300 <= ord('\U0001F600') <= 0x1FAFF)"

常见形态与长度

形态构成UTF-8 字节
基础 emoji(增补平面)单个码点4
基础 emoji(基本平面)单个码点3
带变体选择符码点 + U+FE0F3 或 6
带肤色修饰码点 + 修饰符8
组合序列多码点经 ZWJ 连接可达 20 字节以上
不要用码点区间穷举判断 emoji:Unicode 每个版本都在增补,且存在区域指示符、键帽序列、旗帜与组合序列等特殊形态。工程上应使用 Unicode 官方 emoji 数据或成熟库,并允许随版本更新。
只支持 3 字节字符的环境会直接拒绝或截断 emoji:MySQL 的 utf8 就是典型例子,写入报错或被替换成问号,且丢失不可逆。涉及 emoji 的业务必须在库表、连接、接口层全部支持 4 字节字符。
emoji 的视觉与语义不一致是常态:同一码位在不同平台样式差别很大,某些 emoji 在不同文化中含义不同。涉及内容审核与展示效果的场景,应以目标平台实测为准,不要假设样式统一。

易错点

  • 用 3 字节字符集存储 emoji:写入失败或被替换,数据不可逆丢失 → 使用 utf8mb4 等完整支持
  • 按码点或编码单元截断:代理对被拆开,出现乱码或替换符 → 按字形簇截断
  • 把变体选择符与肤色修饰符当独立字符:字数统计与校验规则全错 → 按序列聚合统计
  • 硬编码 emoji 码点区间做判断:新版本新增字符漏判,出现漏放或误拦 → 使用官方数据或库
  • 忽略零宽连接符被清理:清洗规则删掉格式字符后组合 emoji 被拆散 → 清洗规则排除 emoji 序列内部字符

数据来源与参考

  • Unicode 官方:Emoji 数据文件与 Emoji 版本说明
  • Unicode 官方:变体选择符与呈现形式(UAX #51 相关)
  • Unicode 官方:Unicode 码位区块(Emoticons、Misc Symbols 等)

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/emoji-encoding-basics.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌​‌‌‌‌​‌‌​‌​‌​​‌‌​‌​​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌​‌​‌‌​​​‌​​‌‌​​​​‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​