招聘平台简历过筛
HR 小陈收到一份技术岗简历,技能栏写着「Python、C++、JavaScript」,但复制到内部系统后变成「Python、C++、JavaScript」。多出的零宽空格导致关键词匹配失败,系统自动将简历归入「低匹配」池。用本工具扫描简历全文,半秒标出 3 处隐藏字符,清除后重新上传,匹配分从 42 升至 91,候选人进入面试轮。
从网页上复制一段代码到编辑器,发现编译报错,肉眼检查半天看不出问题——可能是零宽字符混进去了。这个工具把不可见的零宽空格、连接符、双向文本控制符等逐一标出,并支持一键清除。所有检测在浏览器本地完成,粘贴的内容不会上传到任何服务器。
HR 小陈收到一份技术岗简历,技能栏写着「Python、C++、JavaScript」,但复制到内部系统后变成「Python、C++、JavaScript」。多出的零宽空格导致关键词匹配失败,系统自动将简历归入「低匹配」池。用本工具扫描简历全文,半秒标出 3 处隐藏字符,清除后重新上传,匹配分从 42 升至 91,候选人进入面试轮。
后端工程师阿杰收到同事的 PR,改动只有一行,但 diff 显示整行被替换。GitHub 对比面板看不出差异,本地 `cat -A` 才发现行尾多了零宽连字。用本工具粘贴代码块,高亮显示 2 处不可见字符,确认是编辑器插件自动插入的格式符而非恶意注入,PR 顺利合并,避免回滚误判。
运营小张从公众号复制一篇活动文案到小红书,发布后阅读量异常低。对比原文发现,公众号编辑器在每段末尾插入了零宽空格,小红书算法将其识别为「非纯文本」降低推荐权重。用本工具清除所有零宽字符后重发,48 小时阅读量从 230 涨到 1.8 万,互动率恢复至正常水平。
博士生小刘在 Overleaf 写完论文,导出 PDF 提交前用本工具检查源文件。发现摘要末尾藏了一个零宽空格——这是从 Word 模板直接复制时残留的。该字符会导致期刊自动排版系统在「关键词」段落前多空一行,违反投稿格式要求。清除后重新编译,PDF 页码与模板完全对齐,省去一次退修。
电商客服主管老周收到用户投诉,称客服在聊天中发了侮辱性词汇。调取后台日志,原始消息显示为「您好」,但用户截图里「好」字前多了一个零宽空格。用本工具对比双方记录,确认零宽字符只在用户端出现,排除客服发送的可能,判定为第三方截图工具注入,纠纷顺利结案。
| 维度 | 本工具 | 竞品 A(在线检测站) | 传统方法(手工/文本编辑器) |
|---|---|---|---|
| 隐私 | 浏览器内完成,不上传文件 | 需上传文件至服务器 | 完全本地,无网络传输 |
| 速度 | 毫秒级检测,即时出结果 | 受上传和服务器响应影响 | 逐字符肉眼扫描,极慢 |
| 离线可用 | 支持离线使用(PWA 或纯前端) | 必须联网 | 完全离线 |
| 检测范围 | 零宽空格/连接符/非断空格等 10+ 种 | 常见 3-5 种 | 仅能发现可见异常,漏检率高 |
| 清除操作 | 一键清除所有零宽字符 | 多数需手动勾选/复制结果 | 手动删除,易遗漏 |
| 文件大小限制 | 无限制(纯前端处理) | 常有 1-10 MB 上传限制 | 无限制 |
| 收费 | 免费 | 部分功能需付费/会员 | 免费(需人工时间) |
| 输入 | 输出 | 说明 |
|---|---|---|
| HelloWorld | 检测到零宽字符:位置 5(U+200B ZERO WIDTH SPACE) | 常规:最常见的零宽字符嵌入场景,验证工具能否识别 U+200B |
| 正常文本没有隐藏字符 | 未检测到零宽字符 | 常规:纯文本无隐藏字符,验证工具输出正确无干扰 |
| abc | 检测到零宽字符:位置 1(U+200C ZERO WIDTH NON-JOINER),位置 3(U+200D ZERO WIDTH JOINER) | 常规:多个不同零宽字符连续出现,验证工具能逐个列出 |
| ab | 检测到零宽字符:位置 1(U+FEFF ZERO WIDTH NO-BREAK SPACE / BOM) | 边界:BOM 字符(U+FEFF)在文本中常被忽略,验证工具是否将其归为零宽字符 |
| 输入为空,无法检测 | 边界:空字符串输入,验证工具对空值的处理(不报错,给出明确提示) | |
| abcdefghijk | 检测到零宽字符:位置 1,3,5,7,9,11,13,15,17,19,21(均为 U+200B) | 边界:大量零宽字符密集排列,验证工具能否完整列出而不截断 |
| abc def | 未检测到零宽字符 | 易错:换行符(\n)不是零宽字符,用户常误以为换行属于零宽,验证工具不误报 |
| ab | 检测到零宽字符:位置 1(U+200B),位置 2(U+200C),位置 3(U+200D),位置 4(U+FEFF) | 易错:多种零宽字符连续堆叠,验证工具能区分不同 Unicode 码点,而非只报个数 |
1.把零宽空格当成普通空格删除
复制文本到编辑器,用查找替换把空格删掉使用本工具检测后,直接点击「清除零宽字符」按钮零宽空格(U+200B)在视觉上不可见,普通空格替换命令无法匹配它,必须用 Unicode 码位定位清除。
2.混淆零宽连字与零宽不连字
认为所有零宽字符都是同一类,统一清除即可查看检测结果中的 Unicode 码位:U+200D(零宽连字)和 U+200C(零宽不连字)用途不同,清除前需确认是否影响文字渲染零宽连字用于阿拉伯语等复杂文字的正确显示,盲目清除可能导致字符断裂。
3.忽略 BOM 头部的零宽无断空格
从 UTF-8 文件复制内容直接粘贴,不检查开头字符粘贴后查看检测结果中是否有 U+FEFF(字节顺序标记),若存在则清除某些编辑器会在文件开头插入 BOM 作为编码标识,它属于零宽字符,但清除后文件编码可能被误判。
4.误把全角空格当作零宽字符
看到文本中有不可见字符,直接认为全是零宽先使用全角/半角空格检测工具区分,全角空格(U+3000)有宽度,零宽字符无宽度全角空格在视觉上占一个汉字宽度,与零宽字符的不可见性不同,处理方式也不同。
5.复制粘贴时遗漏不可见控制字符
从 PDF 或网页直接选中文本复制,认为已包含所有字符使用「从文件上传」功能或先粘贴到纯文本编辑器再复制到本工具某些 PDF 或富文本中的零宽字符在复制时可能被浏览器或应用过滤,导致检测遗漏。
6.混淆零宽字符与 HTML 实体编码
在 HTML 源码中看到 ‌ 或 ‍ 就认为需要清除在浏览器渲染后复制文本到工具检测,或直接检测 HTML 源码中的实体编码HTML 实体编码是文本表示,不是实际字符;工具检测的是 Unicode 字符,不是编码字符串。
7.清除后不验证结果是否改变语义
清除所有零宽字符后直接使用文本,不检查显示效果清除后对比原文与结果,尤其注意阿拉伯语、泰语等复杂文字是否出现断裂零宽连字/不连字在某些语言中控制字母连接,清除后可能导致文字显示为分离的字母。
ZeroWidthCount = Σ(1 for each char in [U+200B, U+200C, U+200D, U+FEFF, U+2060, U+2061, U+2062, U+2063, U+2064])
ZeroWidthCount文本中零宽字符的总个数U+200B零宽空格 (ZWSP)U+200C零宽非连接符 (ZWNJ)U+200D零宽连接符 (ZWJ)U+FEFF字节顺序标记 (BOM)U+2060单词连接符 (WJ)U+2061函数应用符U+2062隐式乘法符U+2063隐式分隔符U+2064不可见加号输入文本「abc」(a、b、c 之间藏了一个 U+200B 零宽空格)。遍历每个字符:a(非零宽) → b(非零宽) → U+200B(匹配,计数+1) → c(非零宽)。最终 ZeroWidthCount = 1,检测到 1 个零宽字符。
6 种主流语言实现,复制即用:
import unicodedata
text = "Hello\u200bWorld\u200c!" # 含零宽空格(U+200B)和零宽非连接符(U+200C)
# 检测零宽字符
zero_width = [c for c in text if unicodedata.category(c) in ('Cf',)]
print(f"零宽字符: {zero_width}") # 输出: ['\u200b', '\u200c']
# 清除零宽字符
cleaned = ''.join(c for c in text if unicodedata.category(c) not in ('Cf',))
print(f"清除后: {cleaned}") # 输出: HelloWorld!// 零宽字符正则匹配范围: U+200B-U+200F, U+2028-U+2029, U+FEFF, U+00AD 等
const ZERO_WIDTH_PATTERN = /[\u200B-\u200F\u2028-\u2029\uFEFF\u00AD]/g;
const text = "Hello\u200BWorld\u200C!";
// 检测
const found = text.match(ZERO_WIDTH_PATTERN);
console.log("零宽字符:", found); // ['\u200b', '\u200c']
// 清除
const cleaned = text.replace(ZERO_WIDTH_PATTERN, '');
console.log("清除后:", cleaned); // HelloWorld!package main
import (
"fmt"
"regexp"
)
func main() {
text := "Hello\u200bWorld\u200c!"
// 零宽字符 Unicode 范围
zeroWidth := regexp.MustCompile(`[\u200B-\u200F\u2028-\u2029\uFEFF\u00AD]`)
// 检测
found := zeroWidth.FindAllString(text, -1)
fmt.Printf("零宽字符: %q\n", found) // ['\u200b', '\u200c']
// 清除
cleaned := zeroWidth.ReplaceAllString(text, "")
fmt.Printf("清除后: %s\n", cleaned) // HelloWorld!
}#!/bin/bash
# 使用 sed 移除零宽字符(U+200B-U+200F, U+FEFF)
text="Hello\u200bWorld\u200c!"
# 检测(用 hexdump 查看隐藏字符)
echo -e "$text" | xxd | head -1
# 输出: 00000000: 4865 6c6c 6fe2 808b 576f 726c 64e2 808c Hello...World...
# 清除(用 sed 替换零宽字符为空白)
echo -e "$text" | sed 's/\xe2\x80[\x8b-\x8f]//g; s/\xef\xbb\xbf//g'
# 输出: HelloWorld!import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class ZeroWidthDetector {
public static void main(String[] args) {
String text = "Hello\u200BWorld\u200C!";
Pattern pattern = Pattern.compile("[\\u200B-\\u200F\\u2028-\\u2029\\uFEFF\\u00AD]");
// 检测
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println("零宽字符: " + matcher.group()); // 输出: \u200b, \u200c
}
// 清除
String cleaned = pattern.matcher(text).replaceAll("");
System.out.println("清除后: " + cleaned); // HelloWorld!
}
}<?php
$text = "Hello\u{200B}World\u{200C}!";
// 检测零宽字符(使用 mb_ereg 支持多字节)
mb_regex_encoding('UTF-8');
$pattern = '[\x{200B}-\x{200F}\x{2028}-\x{2029}\x{FEFF}\x{00AD}]';
if (mb_ereg($pattern, $text, $matches)) {
echo "零宽字符: " . bin2hex($matches[0]) . "\n"; // 输出: e2808b, e2808c
}
// 清除
$cleaned = mb_ereg_replace($pattern, '', $text);
echo "清除后: $cleaned\n"; // HelloWorld!
?>零宽字符本身不可见,这就是它的用途。检测结果会用高亮色块或特殊标记标出每个零宽字符的位置,比如在字符前后加一个半透明的底纹或括号。你可以在结果区找到类似“U+200B”或“零宽空格”的标识,鼠标悬停或点击能看到具体字符类型。如果工具没有高亮,可能是浏览器渲染问题,试试切换到纯文本视图或复制结果到记事本里看标记。
可能有两种原因:一是工具只检测标准Unicode零宽字符(U+200B零宽空格、U+200C零宽非连接符、U+200D零宽连接符、U+FEFF零宽无间断空格等),但有些隐写用了非标准变体或自定义字符,比如某些特殊空格(U+00A0不换行空格)宽度不为零但肉眼难辨,工具默认不标记;二是文本经过了编码转换(比如从Word粘贴到网页时),某些字符被自动过滤了。建议把源文本直接保存为纯文本文件再粘贴进来。
可以清除所有检测到的零宽字符,清除操作只删除这些不可见字符,不会改动可见的文字、标点或换行。但注意:有些零宽字符有实际语义作用,比如U+200D用于阿拉伯语或某些表情符号的连接,清除后可能导致表情显示异常(比如👨👩👧会变成三个独立头像)。工具会在清除前列出所有字符类型,建议先预览确认哪些是隐写痕迹,再选择批量清除或逐条删除。
微信等即时通讯软件在复制文本时,经常自动插入零宽字符用于排版或标记(比如调整行间距、隐藏的格式化信息)。常见的是U+200B和U+FEFF。这些通常无害,但如果你要发到论坛或系统里,可能触发敏感词过滤或导致格式错乱。建议先用工具的“清除所有”功能处理一遍,再粘贴到目标位置。如果清除后文字粘在一起,可能是去掉了必要的零宽空格,可以只保留U+200B(用于分词断行)而删除其他类型。
支持。工具会逐个扫描每个字符位置,如果连续出现多个零宽字符(比如U+200B+U+200C+U+FEFF),结果区会按顺序列出每个字符的类型和Unicode编码,并用数量统计显示“共发现X个零宽字符”。你可以在结果列表里看到每个字符的索引位置,方便定位。对于隐写场景,连续零宽字符常用来编码二进制信息(比如用不同字符代表0和1),工具不会自动解码,但能让你清楚看到隐写痕迹的分布模式。
不是工具问题,是移动端浏览器的渲染差异。部分手机浏览器(尤其是微信内置浏览器或低版本Chrome)对零宽字符的高亮CSS支持不完整,导致标记色块不显示。解决方法:切换工具页面到“纯文本模式”(如果有切换按钮),或者将检测结果复制到手机备忘录里,零宽字符在纯文本中会表现为不占位的空白,你可以通过光标移动发现它们(光标停在空白处不动就是零宽字符)。电脑端建议用最新版Chrome或Edge。
主要区别在隐私和速度。本工具是纯前端实现(所有代码在浏览器运行),你粘贴的文本不会上传到任何服务器,适合处理敏感内容(比如合同、密码、私密聊天记录)。而在线检测器通常需要上传文本到第三方服务器,可能有数据泄露风险。速度上,本工具处理10万字以内的文本几乎瞬间出结果,因为不需要网络请求;在线工具受带宽和服务器负载影响,大文本可能卡顿。另外,本工具提供清除后的预览和选择性删除,而很多在线工具只有检测功能。
能。很多代码编辑器(尤其是网页版IDE或在线代码片段)在粘贴时可能混入零宽字符,导致编译错误或语法高亮异常。工具可以检测所有Unicode零宽字符,包括U+200B(常在代码注释换行处出现)和U+FEFF(BOM标记)。检测后,建议先用“清除所有”功能去掉这些字符,再粘贴回IDE。如果报错依然存在,可能还有非零宽的不可见字符(如U+00A0不换行空格),本工具不默认检测这类字符,可以手动勾选“检测所有空格变体”选项(如果有)。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。