表情符号字符图
使用代码浏览和复制表情符号
如何使用表情符号字符图
- 1输入或粘贴含 emoji / 特殊符号的文本。
- 2查看每个字符的 Unicode 码点(U+XXXX)与 UTF-8 编码。
- 3可复制码点或实体形式用于代码与文档。
Emoji 与 Unicode:码点怎么看
码点表示:U+1F600(😀);UTF-8 字节:0xF0 0x9F 0x98 0x80每个 emoji 和字符在 Unicode 里都有唯一『码点』,形如 U+1F600。很多 emoji 实际由多个码点组合(如肤色、零宽连接符 ZWJ),所以长度不等于可见字符数。
UTF-8 是网页最常用编码,把码点变成 1–4 个字节。代理对(surrogate pair)让 BMP 之外的字符能在 UTF-16 里表示——这也是为什么 JS 里 '😀'.length 是 2。
本工具把文本拆成字符并列出码点与字节,方便调试『为什么截断/乱码/长度不对』这类问题。
Emoji 的复杂性远超想象:一个「视觉上的 emoji」可能由多个 Unicode 码位组成。家庭 emoji 👨👩👧 实际是「男人 + ZWJ + 女人 + ZWJ + 女孩」共 5 个码位(ZWJ 是零宽连接符 U+200D);国旗 🇨🇳 是两个「区域指示符」字母组合;肤色是基础 emoji 加肤色修饰符。**这意味着用 length 判断长度、用索引截取都可能把一个 emoji 拆碎成乱码。**
存储 emoji 时最容易踩的坑是数据库字符集:MySQL 的 utf8 实际只支持 3 字节(BMP 字符),**存 4 字节的 emoji 会报错或截断**,必须用 utf8mb4。同理,UTF-16 环境下(JavaScript、Java、C#)emoji 占 2 个 char(代理对),所以 '👍'.length === 2,'\u{1F44D}'.length 也是 2(此处为转义写法)。**处理 emoji 时要用 Array.from() 或 Intl.Segmenter 按「字素簇」切分**,而不是按码位。
| Emoji | Unicode | UTF-8 字节 | UTF-16 长度 |
|---|---|---|---|
| 😀 | U+1F600 | 4 字节 | 2(代理对) |
| ❤️ | U+2764 U+FE0F | 6 字节 | 3 |
| 👍 | U+1F44D | 4 字节 | 2 |
| 👨👩👧 | 3 个 emoji + 2 ZWJ | 18 字节 | 8 |
| 🇨🇳 | U+1F1E8 U+1F1F3 | 8 字节 | 4 |
| 👍🏽 | U+1F44D U+1F3FD | 8 字节 | 4 |
| é | U+00E9 | 2 字节 | 1 |
| 中 | U+4E2D | 3 字节 | 1 |
Emoji 编码与字节长度
常见问题
为什么 emoji 算两个字符?
超出基本多文种平面(BMP)的字符在 UTF-16 中用代理对表示,JS 字符串按 UTF-16 单元计数,所以 length 为 2。
码点和 UTF-8 编码有什么区别?
码点是字符在 Unicode 表中的编号(逻辑);UTF-8 是该编号在网络/文件里的字节表示(物理)。一个码点可对应 1–4 字节。
为什么有时 emoji 显示成方框?
系统或字体缺少该 emoji 字形,就会回退成方框/问号。与编码无关,是字体覆盖问题。
为什么我的 emoji 存进数据库变成问号?
九成是字符集问题。MySQL 需要:① 数据库、表、字段的字符集都改成 utf8mb4;② 排序规则用 utf8mb4_unicode_ci(或 MySQL 8 的 utf8mb4_0900_ai_ci);③ 连接字符集也设为 utf8mb4(SET NAMES utf8mb4)。三者缺一不可。MySQL 的「utf8」是残缺的 3 字节实现,这是一个历史遗留的坑,8.0 已默认 utf8mb4 但仍需检查存量表。
怎么给 emoji 加肤色和变体?
肤色用 5 个菲茨帕特里克修饰符(U+1F3FB 到 U+1F3FF,从浅到深)紧跟在支持肤色的 emoji 后面,如 👍 + U+1F3FD = 👍🏽。变体选择符控制显示样式:U+FE0F 强制显示为彩色 emoji,U+FE0E 强制显示为黑白文本样式(如 ❤️ vs ❤︎)。注意不是所有 emoji 都支持这些修饰——只有 Emoji 规范中标记为「支持肤色」的才行,否则修饰符会单独显示成一个色块。
