跳到主要内容

Emoji 转 Unicode 码点:U+1F600 是怎么来的

把 emoji 拆成 Unicode 码点的完整指南。讲清 U+1F600 这种写法、码点和字节的区别、ZWJ 组合 emoji 为何是好几个码点,以及在源码、数据库和调试里该怎么用。

发布于 作者 李雷
#emoji #unicode #编码 #前端 #调试

Emoji 转 Unicode 码点:U+1F600 是怎么来的

一个 😀 看上去是一个字符,但它在内存里、在文件里、在数据库里,从来都不是你看到的那个方块。它是一串 Unicode 码点。搞清楚 emoji 和码点的对应关系,能省掉很多排查诡异乱码的时间。这篇把码点的写法、码点和字节的区别、组合 emoji 为什么是好几个码点,以及它们在实际开发里怎么用,一次讲透。

码点是什么,U+1F600 怎么读

每个 Unicode 字符都有一个唯一编号,叫码点。咧嘴笑脸 😀 的码点是 U+1F600。U+ 是固定前缀,后面是十六进制。同一个码点换种写法,十进制是 128512,HTML 十六进制实体是 😀,HTML 十进制实体是 😀,JavaScript 转义是 \u{1F600},CSS 转义是 \1F600。它们指向的都是同一个字符,只是落地的场景不同。

一个真实的输入输出例子:

输入:  😀
输出:  U+1F600
       128512(十进制)
       😀(HTML 实体)
       \u{1F600}(JS 转义)
       \1F600(CSS 转义)

你需要把 emoji 写进哪种文件,就复制对应那一格。把任意 emoji 粘进 Emoji 转 Unicode 工具,这几种写法会并排列出来。

码点和字节不是一回事

很多人把码点和字节混着用,这是乱码的常见源头。码点是抽象编号,字节是它在硬盘或网络上的实际编码结果。同一个码点 U+1F600,用 UTF-8 编码是四个字节 F0 9F 98 80,用 UTF-16 编码是两个码元 D83D DE00(也就是一个代理对)。

这层区别会直接咬到你。JavaScript 的字符串底层是 UTF-16,"😀".length 返回的是 2,因为一个超过 U+FFFF 的码点占两个 UTF-16 码元。charCodeAt(0) 拿到的只是代理对的前一半 0xD83D,不是完整码点。要正确读码点,得用 codePointAt 或者 Intl.Segmenter 按字素簇切。想看一段文本逐字节的十六进制,可以丢进 文本转十六进制工具 对照着看。

组合 emoji 为什么是好几个码点

不是每个 emoji 都对应单个码点。很多日常 emoji 其实是一串码点拼出来的:

  • 一个家庭 👨‍👩‍👧‍👦 是七个码点:U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466。中间那三个 U+200D 是零宽连接符,把四个人黏成一个字素簇。
  • 一只带肤色的挥手 👋🏽 是基础符 U+1F44B 加修饰符 U+1F3FD(中等肤色,五个肤色修饰符 U+1F3FB 到 U+1F3FF 之一)。基础符单独看是黄色的,修饰符给它换色。
  • 一面旗帜 🇯🇵 是两个区域指示字母 U+1F1EF 和 U+1F1F5,对应字母 J 和 P。

理解这点很关键,否则你存储、比较、截断字符串时会把一个 emoji 劈成两半。

在开发里真正用得上的几个场景

写进源码。 编辑器或构建步骤有时会弄坏裸 emoji 字节。把 😀 转成 \u{1F600} 写进字符串字面量,它能扛过任何编码;CSS 的 content 属性用 \1F600;HTML 标记里用 😀

存进数据库。 旧的 MySQL utf8 编码每字符最多三字节,存不下四字节的 emoji,会报错或截断。要么改用 utf8mb4,要么干脆把 emoji 转成码点序列存成文本,读取时再还原。

调试乱码和裂开。 我自己排查过一个线上问题:用户昵称里的家庭 emoji 在某个旧安卓机上裂成了四个分开的人。把昵称粘进工具,看到七个码点中间的 U+200D 还在不在,一眼就定位到是某个清洗步骤把不可见字符剥掉了。U+200D 一丢,序列就塌。这种问题不拆码点根本看不见。

反过来:从码点还原成 emoji

日志或 JSON 里经常只剩 \u{1F600}U+1F600,看不到字形。这时切到反向,把码点粘进去就读回 emoji。工具能认 U+1F600、裸十六进制 1F600、0x1F600、\u{1F600}😀😀,甚至 UTF-16 代理对转义。用空格隔开列多个码点,它会拼起来,所以粘一整串 ZWJ 序列就能把家庭或旗帜还原回来。需要把 emoji 写成网页里的实体,可以再配合 HTML 实体编码工具 处理周边的特殊字符。

把 emoji 当成码点序列来看,而不是一个不透明的方块,你对它的存储、传输和渲染就有了完全的掌控。下次再遇到 emoji 变问号、裂成几块或者数错长度,先拆码点,答案基本就在那串 U+ 里。


Made by Toolora · Updated 2026-06-13