隐藏符号空白隐形符号
作者:综合 来源:综合 浏览: 【大 中 小】 发布时间:2026-10-17 06:06:43 评论数:
你在网页上看到一段文字,隐藏隐形复制粘贴到记事本里,符号符号发现多出来几个空格。空白删掉,隐藏隐形再复制一次,符号符号空格又出现了。空白这不是隐藏隐形你的错觉——那些空格里可能藏着东西。
零宽字符(Zero-Width Character)是符号符号Unicode标准里的一类特殊码位。它们在屏幕上不占任何宽度,空白肉眼完全看不见,隐藏隐形但计算机读得出来。符号符号最常见的空白有零宽空格 U+200B、零宽非连接符 U+200C、隐藏隐形零宽连接符 U+200D,符号符号还有字节顺序标记 U+FEFF。空白这些字符最初是为排版和语言处理设计的,比如让阿拉伯文或印地文正确连写,或者在泰文、高棉文里标记词边界。问题在于,它们太容易被拿来做别的事了。
我去年碰到一个案例。一个朋友收到份PDF合同,看着没问题,签了。后来对方发来一个“完全一样”的版本,他对比了半天没看出差别。用工具一查,两份文件里的零宽字符编码不同——第一份的某些段落末尾被插入了特定序列的零宽字符,第二份把这些序列改了。肉眼读到的文字一模一样,但机器解析出来的哈希值完全不同。这种手法在合同纠纷里已经不算新鲜。
更隐蔽的玩法是信息隐写。把一段秘密消息转成二进制,0用零宽空格表示,1用零宽非连接符表示,然后把这串零宽字符嵌进一篇正常文章里。文章照常阅读,秘密照常传递。Twitter早年就有人用这招发暗号,后来平台开始过滤。微信、微博也陆续加了检测,但道高一尺魔高一丈,新的变体一直在冒出来。
零宽字符还有一个让人头疼的场景:代码审查。GitHub上有人提交PR,diff里看代码逻辑没问题,合并之后跑起来却报错。原因就是某行代码里混进了零宽字符,编译器把它当成标识符的一部分,变量名对不上。这种bug找起来极其痛苦,因为你的眼睛会直接跳过那些字符。
怎么防?几个实用手段。写代码时开IDE的“显示不可见字符”选项,VS Code和Sublime都支持。处理文本数据时,先跑一遍正则替换,把 [\u200B-\u200F\u2028-\u202F\uFEFF] 这类区间清掉。Python里可以用 unicodedata.category() 过滤掉格式类字符(Cf类别)。如果怀疑某段文本被动了手脚,把它粘到专门的零宽字符检测工具里,比如 zero-width-character-detector 这类在线服务,一眼就能看出藏了多少、藏在哪。
浏览器端也有招。Chrome的开发者工具里,选中文本后在Console执行 copy(getSelection().toString()),再粘到十六进制编辑器里看,零宽字符会以 E2 80 8B 这样的字节序列暴露出来。Firefox有个扩展叫“Zero Width Character Highlighter”,直接把隐藏字符标红。
说回本质。零宽字符本身没有好坏,它们是Unicode为了覆盖全球书写系统不得不引入的工具。坏的是利用信息不对称来搞小动作的人。你不需要成为编码专家,但至少得知道:屏幕上“看起来一样”和“实际上一样”是两码事。下次复制粘贴发现多了空格,别急着删——先想想它是不是在替谁传话。
