表情文案粘贴

点表情拼短句,一键复制;同时用码点、码元、字节三种口径标出长度差别。

点上面的表情追加到文案末尾;点「清空」清空后自己写。粘贴框里按 Ctrl/Cmd+Enter 立即统计,普通 Enter 保留换行。

今天也加油 😀👍🎉 明天继续 💪

长度用三个口径同时给出:Array.from(s).length 数的是 Unicode 码点,s.length 数的是 UTF-16 码元,TextEncoder 量的是 UTF-8 实际字节。表情落在 BMP 之外,一个字形就占 2 个码元、4 个字节,所以三个数字必然不相等——这不是 bug。

使用方法

  1. 直接在文案框里打字或粘贴,示例已经预填 今天也加油 😀👍🎉 明天继续 💪。
  2. 点下方表情按钮追加到末尾;同一句里可以混排中文、空格与表情,编码不统一正是本页要帮你看清的地方。
  3. 点「统计并复制」或按 Ctrl/Cmd+Enter,立刻得到三种长度口径与复制结果。
  4. 要批量取用整组表情,点「导出对照表 CSV」把 12 组表情连同它们的长度数据一起存成表格。
  5. 点「清空」清空重写;点「载入示例」随时回到上面那组示例。

这个表情文案粘贴能解决什么问题

发社交动态时找表情有个反复出现的摩擦:要么在系统表情面板里长距离翻找,要么从别的聊天记录里复制过来、顺手带上一段无关文字。表情文案粘贴做的是把常用表情按用途分组铺开,点一下就追加进句子,省掉翻面板和清理上下文这两步。

它同时解决一个更隐蔽的问题:你算不清自己发出去的内容到底有多长。中文一句 9 个字是 9 个字符,插进 4 个表情后,编辑器显示的字符数会从 9 跳到 20,但真正发到服务端的 UTF-8 字节是 46。有个字段是 VARCHAR(20) 时,代码里没报错、数据库却截断,表情全变问号。表情文案粘贴把码点、码元、字节三个数一起摆出来,让这个坑在发送前就露出来。

本页只做表情挑选、短句拼装与长度换算。要判断文本里有多少个真正的汉字请用字数统计工具,要看字符串在各种编码下的理论占位请用字符数统计工具(本页的码元口径与它的定义一致但多给了字节数)。要把普通文字批量换成表情符号请用表情文本转换器;要生成方括号、冒号那种字符画颜文字请用颜文字生成器——两者字形完全不同,混用会破坏排版。

原理与规则说明:代理对、码点与 UTF-8 三套编号

完整示例(数值仅作演示)

示例文案与工具默认值完全一致:今天也加油 😀👍🎉 明天继续 💪,共 9 个汉字、4 个表情、2 个空格。

长度为按 UTF-8 规则实算的结果,未包含任何平台的表情变体差异。

输入范围与对照表

输入范围:文案框 maxlength="500",按 UTF-16 码元计上限 500,即最多放 250 个 BMP 外表情。空文案会被明确提示而不是给出全零。下表是 12 组常用表情的实测数据,前 12 行全部显示,点「加载更多」可展开到 24 行完整区块说明。

分组拼装效果码元数码点数UTF-8 字节所属区块
微笑😀 😃 😄 😁 😆14924U+1F600–1F606
大笑😂 🤣 🥳 😅 🤪14924U+1F600–1F64F
喜爱😍 🥰 😘 😗 😚14924U+1F600–1F64F
思考🤔 🧠 💬 💭 ✅13923U+1F900–1F9FF
庆祝🎉 🎊 🎆 🎇 🏆14924U+1F380–1F3FF
手势👍 👎 👏 👐 🙌14924U+1F440–1F4FF
心与喜欢❤️ 💕 💝 💛 💜141026U+2700–27BF / 1F490–1F4FF
天气自然☀️ 🌈 🌙 🌟 🍀141026U+2600–26FF / 1F300–1F32F
食物饮料🍎 🍊 ☕ 🍷 🍿13923U+1F340–1F37F
动物🐈 🐕 🐢 🦊 🐸14924U+1F400–1F43F
办公学习💻 📊 📈 📝 ✅13923U+1F4C0–1F4FF
时间数字⏰ ⏳ 🕒 📅 🔢12922U+23E9–23FA
组合 ZWJ👨‍👩‍👧8518U+1F468+200D×2+1F467
肤色修饰👍🏽428U+1F44D+1F3FD
区域指示🇨🇳428U+1F1E8+1F1F3
变体选择符☀️226U+2600+FE0F
纯汉字 8二十个纯汉字示例8824U+4E00–9FFF
纯 ASCII 20abcdefghijklmnopqrst202020U+0020–007A
5 个表情😀😃😄😁😆10520U+1F600–1F606
500 个汉字(上限演示)5005001500U+4E00–9FFF
250 个表情😀×2505002501000U+1F600
中英混排OK 好 done9911混合
含换行第一行
第二行
7719U+000A 算 1 字符 1 字节
含制表符甲乙 丙4410U+0009 算 1 字符 1 字节

常见误用的对照——同一个「长度」在不同场景下要按不同口径取:

场景该用哪个口径填错的后果
数据库 VARCHAR(20)按目标数据库的字节上限算,MySQL utf8mb4 每字符 4 字节超限静默截断,尾部变问号或直接报错
MySQL utf8(旧)每字符上限 3 字节存 😀 报 Incorrect string value
表单 maxlengthHTML 规范按 UTF-16 码元计一个表情算 2,实际比直觉少一半
短信计费长度按计费规则的字符集定义,多数中文短信按 70 字符表情被计成 2 个字符,费用翻倍
统计「有多少个表情」码点数 Array.from(s).length 配合区块过滤用 length 会把一个表情算成两个
POST 请求体积UTF-8 字节数 TextEncoder按字符数预估会低估三成以上

边界与精度

常见问题

为什么一个表情算出来是 2 个字符,不是 1 个?

因为 JavaScript 字符串是 UTF-16。U+1F600 落在 BMP(上界 U+FFFF = 65535)之外,按 Unicode 标准必须用一对 16 位码元表示,所以 length 报 2。要按「字符」数请用 Array.from(s).length,它返回 1。实测 😀 的三个数是:码点 1、码元 2、UTF-8 字节 4。

那为什么「☀」「✌」的长度又是对的?

因为它们在 BMP 内。U+2600 与 U+270C 都小于 65535,只需要一个码元,length 就是 1,UTF-8 占 3 字节。这就是「用 length 数字符」在纯中文和 BMP 符号上一直正确、直到遇见 U+1F600 以上的表情才出错的原因——错误只在部分字符上出现,所以很难被发现。

👨‍👩‍👧 这个家庭表情只有 1 个字形,为什么占 8?

它是 ZWJ 序列:3 个人物表情各占 2 码元,中间 2 个 U+200D 零宽连接符各占 1 码元,合计 3×2 + 2 = 8 个码元、5 个码点、18 个 UTF-8 字节。屏幕上只渲染 1 个字形。数据库若按 length 分配定长字段,会给这个字形记 8 个字符的额度,浪费且容易在截断时出问题。肤色修饰符 👍🏽 与国旗 🇨🇳 同理,都是 4 码元 / 2 码点。

存进 MySQL 报错 Incorrect string value,是编码问题还是长度问题?

是字符集问题。MySQL 的 utf8 实际是 utf8mb3,每字符最多 3 字节,存不下占 4 字节的 😀。解决办法是把表和连接的字符集都改成 utf8mb4。改完还不够时要检查字段长度:utf8mb4 下每字符最多 4 字节,VARCHAR(20) 实际能装 20 个字符但最多 80 字节,容量口径和直觉不同。

复制按钮点了没反应,是没复制成功吗?

多数情况是 Clipboard API 的安全上下文限制:navigator.clipboard 只在 HTTPS 或 localhost 下可用,通过 HTTP 访问且域名不是 localhost 时会降级到 execCommand。本页已内置降级路径,若仍失败请手动全选文案框内容复制。另外部分浏览器在页面未获得焦点时会拒绝剪贴板访问,先点一下页面空白处再试。

粘贴进来的表情显示成方框或问号,是页面的问题吗?

不是,通常是上游在传输时按字节截断,把一个 4 字节的表情切成了半个。落在 U+D800–U+DFFF 的孤立代理项就是证据。本页的码点统计会把它如实显示出来,但修复必须回到产生截断的地方——检查接口的字段长度限制、数据库列宽或中间层的 buffer 大小。

文案框最多能放多少个表情?

上限 500 是按 UTF-16 码元算的(HTML 的 maxlength 就是这个口径),而一个 BMP 外的表情占 2 个码元,所以最多放 250 个。250 个纯表情对应 1000 字节 UTF-8;换成 500 个汉字则同样占满 500 码元但体积是 1500 字节。如果你要放进短信,70 字符的计费长度实际只够 35 个纯表情。

这个工具免费吗?文案会被上传吗?

免费,无需注册。统计与复制全部在浏览器本地完成,页面不发任何网络请求,可以在开发者工具的 Network 面板里点几次「统计并复制」确认请求列表始终为空。文案不写 Cookie、不写本地存储、不做持久化,刷新页面即清空。

相关工具