零宽字符隐写
常见零宽与不可见字符
| 码点 | 名称 | 转义写法 | 正常用途 / 风险 |
|---|---|---|---|
U+200B | ZWSP 零宽空格 | \u200B | 给长单词提供换行点。最常被拿来做隐写载体。 |
U+200C | ZWNJ 零宽不连字 | \u200C | 阿拉伯语、波斯语里阻止字母连写。本页用它表示二进制 0。 |
U+200D | ZWJ 零宽连字 | \u200D | emoji 组合(👨👩👧 就是用它连起来的)。本页用它表示二进制 1。 |
U+2060 | WJ 单词连接符 | \u2060 | 禁止在此处断行,不产生空格。 |
U+FEFF | ZWNBSP / BOM | \uFEFF | 文件头的字节序标记。出现在文件中间往往是编辑器留下的垃圾,会让 JSON 解析失败。 |
U+00AD | 软连字符 | \u00AD | 只在断行时才显示的连字符,平时不可见。 |
U+180E | 蒙古文元音分隔符 | \u180E | Unicode 6.3 后归为格式字符,宽度为零。 |
U+2061–U+2064 | 数学不可见运算符 | \u2061 | 排版数学公式用,正文里出现即异常。 |
用法说明
- 编码方式
- 秘密文本先按 UTF-8 转成字节,每个字节拆成 8 位二进制,0 用
U+200C、1 用U+200D表示,末尾用U+200B作结束标记。选「4 字符」时改用四个零宽字符各表示 2 个二进制位,隐写串长度减半,但个别编辑器对U+FEFF处理不一致,兼容性略差。 - 什么地方会失效
- 零宽字符本质上还是字符,会被这些环节吃掉:微信、钉钉等 IM 的部分输入框会过滤;数据库字段做了
TRIM或字符白名单;文本经过「复制为纯文本」以外的再排版;粘进代码编辑器时被 lint 规则自动清理。所以它适合做追踪水印,不适合当可靠的传输通道,更不能当加密用——任何人拿这页都能读出来。 - 「均匀打散」是干什么的
- 默认把整串零宽字符堆在一起,对方只要删掉末尾就全没了。选打散后会把它们按字符间隔分散到载体全文,即使被截掉一段,剩下的部分仍可能解出前半截内容。代价是载体文本被切碎,某些富文本编辑器会在这些位置插进多余标签。
- 怎么防别人给你夹带
- 从网页、文档复制大段文字到自己的系统前,用「检测与清除」过一遍。日常还可以在入库前统一用正则
/[\u200B-\u200F\u2060-\u2064\uFEFF\u00AD\u180E]/g清一次——注意别把U+200D一刀切,emoji 组合要靠它,清理用户昵称时尤其容易把 👨👩👧 拆成三个人。 - 相关工具
- Unicode 转换、特殊符号大全、Emoji 大全、文本批量替换。