零宽字符是怎么把信息藏进文字的?
一段看起来一模一样的文字,字符数却多了几十个——多出来的那些,就是藏起来的消息。
零宽字符是一类宽度为零、看起来完全不存在,但在编码中真实占位的 Unicode 字符。它们本来有正当用途:零宽空格提示长单词可以在哪里断行,零宽连字用于控制阿拉伯文、天城文的连写,也用于把多个 emoji 组合成一个。
把这些字符当成一个小的字母表,把要藏的内容转成二进制后逐位映射上去,再插进正文任意位置,就得到一段外观不变、字符数变多的文本。读的人只要按同样的映射规则把零宽字符挑出来还原,就能取回消息。
零宽字符最常见的出场方式其实不是隐藏消息,而是制造麻烦:从网页、聊天窗口或 PDF 里复制出来的文本,可能夹带几个不可见字符,于是密码验证失败、用户名提示不存在、表格查找匹配不上,而屏幕上完全看不出区别。
理解它的原理有两层价值:一是知道怎么清理这类脏字符,二是知道怎么用它做正当用途,比如给每个收件人的文档嵌一个独有的水印,用于追踪泄露来源。
1几个常见的零宽字符
它们的共同点是显示宽度为零,区别在于各自承担的排版语义。
| 码位 | 名称 | 原本用途 |
|---|---|---|
| U+200B | 零宽空格 | 提示长单词或长链接可以在此断行 |
| U+200C | 零宽不连字 | 阻止相邻字母连写,用于阿拉伯文、天城文 |
| U+200D | 零宽连字 | 强制相邻字符连写,是 emoji 组合序列的粘合剂 |
| U+2060 | 单词连接符 | 禁止在此断行,效果类似不断行空格但零宽 |
| U+FEFF | 字节序标记 | 文件开头的编码标记,也可作零宽不断行空格 |
把「零宽空格」和「空格」混为一谈是最常见的误解。普通空格有宽度、会显示在屏幕上,零宽空格不占宽度。
2隐藏消息的编码方式
基本做法是把内容先转成字节,再把每个字节拆成 8 个二进制位,每一位对应一个零宽字符。用两个字符做字母表时,每个字节需要 8 个零宽字符;用四个字符做字母表时,每个字符能承载两位信息,开销减半。
- 把要隐藏的内容按 UTF-8 转换成字节序列。
- 取出每个字节的 8 个二进制位。
- 把 0 和 1 分别映射到两个零宽字符,例如零宽空格表示 0、零宽不连字表示 1。
- 把生成的零宽字符串插进正文,可以集中在开头,也可以均匀分散到各个词之间。
- 末尾加一个约定的结束标记,还原时读到标记就停止。
3这是隐藏,不是加密
必须区分这两件事。隐藏只保证「不显眼」,不保证「读不到」。任何人只要拿到一段可疑文本,用同样的规则把零宽字符筛出来就能还原内容,不需要任何密码。真正需要保密时,应当先用加密算法处理,再把密文藏进零宽字符里,这样既需要拿到载体也需要知道口令。
- 隐藏提供的是
- 不显眼、肉眼不可见
- 隐藏不提供的是
- 保密性、抗破解能力
- 叠加加密后
- 需要同时拿到载体与口令才能还原
- 适合的正当用途
- 文档水印、给不同接收者的版本做标记、谜题设计
4什么时候必须清理这些字符
零宽字符也会被用来绕过滤和仿冒标识:把它们塞进用户名可以让两个视觉完全相同的名字在系统里是不同字符串;塞进链接可以让肉眼看不出的字符改变实际指向。因此对于外部输入的文本,在入库、比对、发布前清理一次是必要的。
- 口令与验证码
- 粘贴后校验失败,往往就是夹带了零宽字符
- 用户名与昵称
- 需防止用零宽字符构造视觉相同的仿冒账号
- 表格与数据库匹配
- 字符串看起来一样却查不到,先怀疑不可见字符
- 代码与配置
- 零宽字符混入会引发难以定位的语法错误或比对异常
顺着这个问题往下用
全部工具总览 →相关疑问
怎么快速判断一段文字里有没有零宽字符?
最直接的办法是把文本按码位列出,看是否出现 U+200B 到 U+200D 以及 U+FEFF 这些值。也可以直接数可见字符数与实际字符数是否一致,不一致就说明夹了东西。
为什么有些平台复制过去后隐藏内容丢了?
不少聊天软件与社交平台在存储时会清理或规范化零宽字符,属于反垃圾与防仿冒措施。所以隐藏内容能否存活取决于传输路径,可靠的做法是在目标平台上先做一次往返测试。
零宽字符会影响搜索引擎收录吗?
会带来负面影响。混入的不可见字符会让正文与关键词产生看似无意义的差异,也可能被判定为刻意操纵。对外发布的文本应当在发布前统一清理。
除了零宽字符,还有别的文字隐写方式吗?
有,比如利用同形异义字符替换、在行尾加入不可见空白差异、用标点变体编码等。它们的共同点都是改变字节而不改变外观,因此清理思路也一致:对外文本统一做字符规范化。
继续看:相关问题与资料
全部问题解答 →内容说明:本页针对具体使用问题作答,方法步骤与数值由本站自行整理与复算,事实性内容以对应官方规范与文档为准。内容最后核对日期:2026-10-08。若发现错误,欢迎通过页脚反馈入口告知。
速查在线工具箱