← 返回工具指南
工具指南Unicode隐形字符零宽空格BidiBOM文本清理

隐形字符怎么检查?零宽空格、Bidi 控制符、BOM 与 Unicode 规范化指南

说明零宽空格、BOM、软连字符、特殊空格和双向文字控制符为何会影响搜索、代码和文件名,以及如何分级清理。

打开配套工具 →

两段文字肉眼看起来完全相同,却可能搜索不到、无法去重、签名校验失败或生成不同网址。原因之一是文本中混入了零宽空格、BOM、软连字符、特殊空格、组合字符或文字方向控制符。

可以使用 Unicode 隐形字符检查器 在浏览器本地扫描每个码点,显示行列位置、Unicode 编号、类别和风险,再选择保守清理、格式控制清理或空格标准化。工具不会上传文本。

零宽字符是什么

零宽空格 U+200B 不显示宽度,但会存在于字符串中。它可以用于某些语言的换行提示,也可能来自网页复制、富文本编辑器、PDF 或人为插入。BOM U+FEFF 在文件开头可以表示字节顺序,但出现在正文中时通常表现为零宽不换行空格。

软连字符 U+00AD 只在需要换行时显示连字符,平时可能完全看不见。这些字符进入商品 SKU、域名、邮箱、文件名或数据库唯一键后,会让“看起来一样”的值实际不相等。

ZWJ U+200D 和 ZWNJ U+200C 不能简单归类为垃圾。它们参与部分文字的连接行为,也用于组成 Emoji 序列。全部删除可能改变语言拼写或把一个 Emoji 拆成多个符号。

特殊空格为什么会影响排版和匹配

普通空格是 U+0020,但 Unicode 还包含不换行空格 U+00A0、窄不换行空格 U+202F、全角空格 U+3000 和多种排版宽度空格。

网页从 HTML 复制时经常带入 NBSP。它看起来像普通空格,却不会被简单的 split(" ") 或普通替换命中。表格去重、关键词统计、搜索和正则匹配都可能因此出现意外结果。

把特殊空格统一为普通空格适合商品标题、标签和机器处理字段,但法文标点、数学排版或需要不换行的内容可能依赖这些差异,清理前应先看位置。

Bidi 双向控制符有什么作用

阿拉伯语、希伯来语与拉丁文字混排时,需要双向文本算法决定显示顺序。Unicode Bidirectional Algorithm 定义了嵌入、覆盖、隔离和方向标记等控制字符。

这些字符在正常多语言文本中有用途,但 RIGHT-TO-LEFT OVERRIDE 等覆盖符也可能让文件名或代码的显示顺序与真实字符顺序不同。安全审查时应特别关注 U+202AU+202E 和方向隔离符,不能只看编辑器渲染后的外观。

检测器把这类字符标为高风险或需注意,但“发现”不等于“恶意”。应结合语言、文件来源和使用场景判断。

为什么 JavaScript 的长度和位置会不一样

JavaScript 字符串的 length 统计 UTF-16 码元,不一定等于用户看到的字符数量。基本多文种平面之外的码点通常占两个码元,一个 Emoji 还可能由多个码点和连接符组成。

排查文本时最好同时记录码点序号、UTF-16 码元索引、行号和列号。编辑器 API 常使用码元索引,而人类沟通更适合行列位置。

NFC 和 NFKC 规范化有什么区别

MDN 的 String.normalize() 说明 指出,同一个抽象字符可能由一个预组合码点表示,也可能由基础字母加组合符表示。NFC 会把规范等价序列转换为组合形式,适合减少“看起来相同但编码不同”的情况。

NFKC 还会处理兼容等价,例如把部分连字、圈字或宽度变体折叠到普通形式。它有利于搜索和比对,但可能改变原始外观。因此:

为什么不应该一键删除全部不可见字符

“不可见”只描述渲染效果,不代表无意义。连接符影响复杂文字和 Emoji,组合字符参与重音,方向标记支持双向语言,变体选择符决定某些符号显示为文本还是 Emoji。

更安全的分级策略是:

  1. 保守清理只移除常见粘贴残留,如零宽空格、正文 BOM 和软连字符。
  2. 格式控制清理再移除方向、连接和控制符,只用于确认不需要这些语义的机器字段。
  3. 空格标准化把特殊空格改成普通空格,适合搜索和去重副本。
  4. 原始文本始终单独保留,不直接覆盖。

常见故障场景

隐形字符经常造成:

遇到这些问题时,应先比较码点而不是继续尝试肉眼删除空格。

清理后的验证方法

清理前后可以记录码点数量、特殊字符明细和规范化方式;把清理结果复制到目标系统测试搜索、去重或解析;对于代码和配置,再运行语法检查与测试;对于多语言文本,让熟悉该语言的人确认显示没有改变。

最重要的是把“检测”和“删除”分开。检测器负责让隐藏内容可见,清理策略则必须根据字段用途作出选择。