从网页复制一段文字粘贴到别处,明明显示正常,搜索却搜不到、程序处理就报错——很可能这段文字里混入了「零宽字符」。它们是真实存在、占字符位数、却不占显示宽度的 Unicode 字符,看不见摸不着,但一直在起作用。
| 字符 | 码点 | 名称 |
|---|---|---|
| U+200B | 零宽空格 | ZWSP,最常见 |
| U+200C | 零宽非连接符 | ZWNJ,排版连字控制 |
| U+200D | 零宽连接符 | ZWJ,表情符号合成的胶水 |
| U+FEFF | 零宽不换行空格 | 出现在文件头就是 BOM |
其中 U+200D(ZWJ)你每天都在用:👋+ZWJ+🌊 组合成「人浪」表情,👨+ZWJ+👩+ZWJ+👧 组合成三口之家。它是表情系统的正当成员;而 ZWSP 和 U+FEFF 出现在普通正文里,多半是麻烦的开始。
典型中招场景:从某些网页、文档导出的文字直接粘贴进代码编辑器或数据库查询语句,程序行为诡异但怎么都看不出差异。
零宽字符也能做好事——隐形水印。原理是用几种零宽字符的不同排列编码信息(比如用 ZWSP 和 ZWNJ 表示二进制 0 和 1),把署名或编号悄悄织进正文:
看得见的水印可以被裁剪掉,隐形水印跟着字符走,删除它需要专门的清洗——这是它的独特价值,也是争议所在:有人用它保护版权,也有人用它偷偷标记读者。技术中性,用途自选。
问:怎么肉眼发现零宽字符?
肉眼不行,这是它的定义特性。必须用检测工具:粘贴文本,工具统计每个零宽字符的数量并标注位置,一键清除即可还原干净文本。
问:清除会不会破坏正常内容?
不会。零宽字符在显示层面本来就不可见,删除只影响隐形信息。但注意:如果文本是故意嵌入水印的版权内容,清除等于洗掉标记,使用前想清楚。
问:代码里出现零宽字符怎么排查?
怀疑变量名或字符串异常时,用检测工具扫一遍源文件;编辑器开启「显示不可见字符」也有帮助。
看不见的东西最容易被忽视,也最有信息量。认识零宽字符,等于给自己的文本处理流程补上一块常见盲区。