使用方法
第一步,选方向。表情文本转换器默认停在「编码:文字 → 表情」,输入框里已经填好 Hello 2026,打开页面结果区就有内容,不需要先点任何按钮。想解密就把方向切成「解码:表情 → 文字」。
第二步,填内容。编码方向可以填任意文本:英文字母和数字会被替换,空格换成空白格,中文、标点、换行等不在 37 项映射表里的字符会原样留在结果中。解码方向请填入用同一张表编码出来的表情串,符号之间用空格或换行分隔。
第三步,看结果。结果区给出转换后的整段内容,下面一行统计三个数:总字符数、被替换的字符数、原样保留的字符数。默认示例的统计是「总字符 10,已编码 10,原样保留 0」,因为 Hello 2026 这十个字符全部在表内。
第四步,点「复制结果」把整段结果放进剪贴板,再粘到聊天窗口即可。textarea 里回车照常换行,要手动触发转换请按 Ctrl 加 Enter(macOS 上是 Cmd 加 Enter);正常情况下每敲一个字符结果就已刷新,用不到快捷键。
点「载入示例」把方向、输入一起还原成默认值。下方映射表的「导出映射表 CSV」下载带 UTF-8 BOM 的表格,Excel 打开中文与表情都不会乱码;「复制映射表」按 TSV 复制,可直接粘进表格软件。
这个工具能解决什么问题
第一,给聊天和弹幕一个不影响阅读的花式写法。把一句话换成表情串,视觉上比纯文字跳,但因为映射固定、可逆,对方拿同一张表就能还原,比随机表情靠谱。空格保留为空白格这一点很关键,没有它整串表情会粘成一团,根本看不出词在哪断。
第二,当作轻量编码练手和教学样本。37 项一一对应、无冲突、可逆,是讲清「字符集、码位、代理对、大小写折叠」这些概念最省事的素材。本页的循环里就同时处理了这四件事:按感知字符迭代、用码点区间判断代理对、查表前先折叠大小写、表外字符原样透传。
第三,快速生成占位或测试文本。需要一串「看得见长度又不会读错」的样本时,表情串比 lorem ipsum 直观:数符号个数就知道原文有几个字符,做前端截断与行高测试不容易看花眼。
第四,验证表情在目标环境能不能正常显示。把一串表情贴到目标平台,能立刻看出哪些符号显示成方框。悠悠球和部分时钟类表情在旧系统上可能缺字形,结果区会如实显示你系统上的实际样子。
本页不做这些事:不做随机表情生成;不把中文映射成表情;不处理拼音、谐音或缩写替换;不生成可点击的链接或图片。它只回答「这段文字按这张 37 项表换过去是什么,以及换回来的结果是什么」。
转换原理与变量说明
核心是一张固定映射表,共 37 项:26 个小写英文字母、10 个数字、1 个空格,每项对应一个表情,写在脚本里永不改变。编码就是遍历输入、逐字符查表;解码就是把表情串按空白切开、逐个反查。两张表互为反向,任意一项都不会冲突。
大小写折叠。查表前先把字符转成小写,所以 Hello 和 hello 编出来完全一样,解密结果也一律是小写。这是本页唯一的信息损失:原文的大小写、以及「空格和制表符」的区别,编过去就分不出来了。若原文必须保留大小写,请不要用本页编码。
按感知字符迭代,而不是按码元。JavaScript 的字符串用 UTF-16 存储,一个字符可能占一个码元,也可能占两个(代理对)。本页的循环在遇到高位代理(0xD800 到 0xDBFF)时连同后面的低位代理一起跳过,保证一个 Emoji 符号只算一个字符。默认示例全是基本多文种平面字符,看不出来;输入里一旦带了绘文字,统计数就会和「按码元数」差开。
表外字符原样透传。中文、英文标点、换行符、制表符都不在表内,编码时按原字符 push 进结果,解码时按原 token 保留。因此一段中英混排的文字编过去,中文部分会和表情长得很像但并不是加密内容,看到时要能分辨。
分隔符的选择。编码结果用单个空格连接各个符号。这个空格是给人看的视觉分隔,不是加密内容的一部分;解码时按空白切开,所以空格、换行、连续多个空格在解码时等效。若把编码结果里的空格手动删掉,整串会粘成一个 token,解密立刻失效。
完整示例(默认输入实测)
示例条件与页面默认值完全一致:编码方向,输入 Hello 2026。逐字符核对——H 折叠成 h 查表得 🏠,e 得 🐘,l 得 🍋,第二个 l 仍是 🍋,o 得 🍊,空格得 ⬜,2 得 🕑,0 得 🕛,2 得 🕑,6 得 🕕。十个符号用空格连起来,结果区显示「🏠 🐘 🍋 🍋 🍊 ⬜ 🕑 🕛 🕑 🕕」,统计行显示「总字符 10,已编码 10,原样保留 0」。
换几段文本看边界行为:
- 输入「中文 abc 123」:中和文原样保留,空格转 ⬜,a、b、c 转 🍎🐝🐱,空格转 ⬜,1、2、3 转 🕐🕑🕒;统计为「总字符 10,已编码 8,原样保留 2」;
- 输入「A man, a plan.」:大小写折叠后 A 与 a 同为 🍎,逗号和句号原样保留,统计为「总字符 14,已编码 12,原样保留 2」;
- 把默认示例的结果整段粘回输入框并切到解码方向:得到 hello 2026,统计为「总符号 10,已解码 10,未识别 0」,注意 H 变成了小写 h。
混合识别的情况也试一下:输入「🍎 🐝 🐱 中文」并切到解码方向,前三个符号解出 abc,中文不在表内原样保留,结果是「abc中文」,统计为「总符号 4,已解码 3,未识别 1」。未识别不等于报错,只有整段一个都解不出来时才提示错误。
需要提醒:编码结果里的空格是视觉分隔,复制粘贴时若被聊天软件吞掉或合并,解密就会失败。发现解不出来时,先数一下符号个数和原文的字符数是否一致,再检查空格是否还在。
表情映射表
下表共 37 行,默认显示前 12 行(a 到 l),点「加载更多(还有 25 项)」展开剩余字母、数字和空格。三列分别是原字符、表情和助记词,助记词取英文首字母或形象联想,背起来比死记快得多:a 是 Apple 所以用 🍎,u 是 Umbrella 所以用 ☂️,z 是 Zzz 所以用 💤。
数字十项用时钟面表示:0 是 🕛 十二点整,1 到 9 依次是 🕐 到 🕘,顺序和数字大小一致。空格一项用 ⬜ 空白格,视觉上最接近「这里原本有个空格」,也是让整串表情保持可读的关键。
这张表是写死在页面里的固定规则,不是随机生成的,也不随输入变化。换一台电脑、换一个浏览器、甚至离线打开,编出来的结果都一模一样。要解密别人发的表情串,必须确认对方用的是同一张表。
结果边界与舍入
- 空输入。输入框为空时点转换,会提示当前方向要求的格式:编码方向要「至少一个字符」,解码方向要「至少一个表情符号」。不会把空结果当成正常输出。
- 解码一无所获。解码方向下一个符号都没匹配上时,会提示「这段内容里没有可识别的表情」,并说明本页只认识映射表里的 37 个符号、符号之间需用空格分隔。部分可识别时照常输出,未识别部分原样保留并在统计行计数。
- 大小写不可逆。编码时大小写折叠成小写,解密结果一律小写。原文若有大小写信息,请勿用本页作为加密手段。
- 空白类型被合并。空格、制表符、多个连续空格在解码时等效,因为按空白切开。原文的缩进和换行结构编过去会丢失,解密回来只剩单词边界。
- 表情长度不等。有的表情占一个码元,有的占两个(☂️ 是 U+2602 加 U+FE0F,🪀 是 U+1FA80)。本页按感知字符迭代,不会把一个表情拆成两半,统计数与符号个数始终对齐。
- 显示依赖系统字形。结果区显示的是你系统上的实际字形,缺字形的平台会显示成方框,这不影响复制出去的码位。
- 全程本地。转换只在当前浏览器里做,不发起网络请求,不写 Cookie 和 localStorage。
常见问题
为什么 Hello 编出来是 🏠 🐘 🍋 🍋 🍊?
因为查表前先把大写 H 折叠成小写 h,h 对应 🏠(House 房子);e 对应 🐘(Elephant 大象);l 对应 🍋(Lemon 柠檬),出现两次所以有两个 🍋;o 对应 🍊(Orange 橙子)。每个符号只由字符本身决定,和位置无关。
解密回来为什么变成小写了?
因为编码时做了大小写折叠:查表前统一转成小写,大写和小写查的是同一项。原文的大小写信息在这一步被丢掉,所以解密只能给出小写形式。这是固定映射表的固有取舍,不是 bug。
中文为什么没有被转换?
因为映射表只有 37 项,全部是 26 个英文字母、10 个数字和一个空格,里面没有任何汉字。中文不在表内,编码时按原字符透传,看起来就像没被处理。这是有意的范围收缩:给几千个汉字各配一个表情既记不住也容易撞车。
空格为什么要转成 ⬜?
空格若原样保留,整串表情里就会出现真正的空格,和符号之间的分隔空格混在一起,解密时无法判断哪个是词间空格。转成 ⬜ 之后只剩一种空格,切开即可还原。
可以把结果里的空格删掉吗?
不建议。空格是符号之间的视觉分隔,解码时按空白切分,删掉后整串会粘成一个 token,反查表时找不到对应项。若担心聊天软件吞空格,可以改成用换行分隔,解码时换行和空格等效。
这套映射是随机的吗?
不是。37 项全部写死在页面脚本里,不调用随机数,不联网,不随时间变化。同一段文字在任何设备、任何时间编出来的结果都完全相同。这也是它能被反向解密的前提。
为什么有的表情显示成方框?
方框表示你的系统缺少该码位对应的字形,通常是系统表情字体版本较旧。悠悠球 🪀 是 Unicode 13.0 新增的符号,旧系统上容易缺。复制出去的码位是正确的,换一台新设备或更新字体后即可正常显示。
我的数据会被上传吗?
不会。所有转换只在当前浏览器本地执行,页面不发起任何网络请求,也不写 Cookie 或 localStorage。