零宽空格(U+200B)是合法Unicode控制字符,但属需主动清理的干扰字符;可通过JSON编码、长度比对、编辑器显示或正则探测识别,并在用户提交、入库前、日志处理及敏感词匹配前统一过滤。

零宽空格(U+200B)不是“非法字符”,而是合法的 Unicode 控制字符,但它在多数业务场景中属于**需主动清理的干扰字符**——它不显示、占长度、破坏匹配、引发存储或解析异常。识别和过滤的关键在于:先精准定位,再按需清除。
一、快速识别零宽空格的几种实用方式
不用依赖专业工具,日常开发中就能高效发现:
-
用 JSON 编码暴露:将字符串传入
json_encode()(PHP)、JSON.stringify()(JS)或ObjectMapper.writeValueAsString()(Java),零宽空格会显形为u200b; -
检查字符串长度与视觉长度差异:比如肉眼看到 5 个字,但
.length返回 8,多出的 3 位极可能是零宽字符; - 用支持显示不可见字符的编辑器打开:如 VS Code(开启 "Render Whitespace")、Notepad++(视图 → 显示符号 → 显示所有字符)、Sublime Text(View → Characters → Show All Characters);
-
正则匹配探测:在控制台或调试器中运行
/[u200Bu200Cu200DuFEFFu2028u2029]/.test(str),返回true即存在常见零宽字符。
二、主流语言中过滤零宽空格的写法
过滤目标通常包括 U+200B(ZWSP)、U+200C(ZWNJ)、U+200D(ZWJ)、U+FEFF(BOM)、U+2028/2029(分隔符)等。以下为简洁可靠的写法:
-
JavaScript:
str.replace(/[u200B-u200DuFEFFu2028u2029]/g, ''); -
Java:
str.replaceAll("[\u200B-\u200D\uFEFF\u2028\u2029]", ""); -
C#:
Regex.Replace(str, @"[u200B-u200DuFEFFu2028u2029]", ""); -
PHP:
preg_replace('/[x{200B}-x{200D}x{FEFF}x{2028}x{2029}]/u', '', $str); -
MySQL(UPDATE 场景):
UPDATE table SET content = REGEXP_REPLACE(content, '[\u200B-\u200D\uFEFF\u2028\u2029]', '');(MySQL 8.0+ 支持)
三、过滤时机比写法更重要
零宽空格常来自复制粘贴、AI 生成内容、富文本编辑器(如微信公众号后台)、第三方 API 返回数据。因此建议在以下环节嵌入清洗逻辑:
-
用户提交入口:表单提交时、API 接口接收参数后立即清洗(如 Spring Boot 的
@RequestBody后置处理); - 数据库入库前:使用 MyBatis TypeHandler 或 JPA @PrePersist 统一过滤;
- 日志/审计文本处理前:避免因隐藏字符导致日志解析失败或长度超限;
- 敏感词匹配前:必须先移除零宽字符,否则精确匹配和哈希校验都会失效。
四、特别注意 BOM 字符(U+FEFF)
文件开头的 uFEFF 常被误认为“空白”,实为字节顺序标记(BOM)。Maven 编译报错 illegal character: ufffe、Java 文件读取异常、JSON 解析失败,往往就是它在作怪。解决方法:
- 用编辑器另存为 UTF-8 without BOM;
- 命令行批量清除:
sed -i '1s/^//' *.java(Linux/macOS); - 代码中提前截断:
if (str.startsWith("uFEFF")) str = str.substring(1);。

















