使用方法
本页把「清掉看不见的控制字符」做成纯前端小工具,打开就带一组非空示例,不必先找素材就能看到清洗效果。把疑似带隐藏字符的文本粘进上方「原始文本」框,按 Ctrl 或 Cmd 加 Enter 立即清洗,也可以点「清洗文本」。下方「清洗结果」框实时显示删完控制符后的纯文本,旁边一行统计「已删除 N 个控制字符,清洗后剩 M 个字符」,结果区带 role="alert" 供读屏朗读。
如果你只想去掉不可见控制符、但想留住原本的换行,勾上「保留换行符(LF/CR)」:这样回车与换行会保留,BEL、TAB、ESC、DEL 等其余控制符照删。点「复制结果」把清洗后的文本收进剪贴板;点「载入示例」把一组含 BEL、TAB、回车、US、DEL 的演示文本还原回去,肉眼看不见那些隐藏字符,但清洗后会看到它们被整段剔除。
本工具不改动任何可见字符的编码:中文、英文、数字、标点、emoji 原样保留,只删位于不可见控制区间的字符,也不会把空格(U+0020)当成控制符删掉。所有处理都在当前浏览器内完成,不发起网络请求,不写 Cookie,也不把你的文本上传到任何服务器。
能解决什么问题
第一类痛点来自从 PDF、Word、网页富文本里复制粘贴。这些文档内部常夹带 NUL、BEL、SOH、私有控制标记等不可见字符,肉眼完全看不出,但一旦进入代码、数据库或接口,就会引发终端乱码、MySQL 报「Incorrect string value」、JSON 解析崩溃、CSV 字段错位。本页删除控制字符正是为这种「文本看起来正常却总是报错」的场景服务,先过一遍再入库就稳了。
第二类痛点来自旧系统导出与跨协议传输。大型机、telnet 会话、串口日志会用控制字符做行结束、分页、转义;不同系统对换行(CR/LF/CRLF)的约定不一,混进来的控制符会让日志分析、正则匹配、全文检索全军覆没。把这些字符清掉,下游脚本才能稳定工作。
本页不解决这些事:它不改可见字符、不转码(那是 Base64/编码工具的活)、不做 Unicode 归一化(那是专门的 NFC/NFD 工具)、也不压缩或去重。它只回答一个问题:把文本里不可见的控制字符剔除,保留一切正常内容。
原理和变量
控制字符是看不见、用来做协议与传输控制的字符。Unicode 把 U+0000 到 U+001F 这 32 个叫 C0 控制字符(NUL、SOH、STX、BEL、TAB、LF、VT、FF、CR、ESC 等),U+007F 是 DEL,U+0080 到 U+009F 这 32 个叫 C1 控制字符。它们本意是终端、打印机、通信协议用的指令,不是给人看的文字。本页的判定区间就是这三段:cp <= 0x1F、cp === 0x7F、以及 cp >= 0x80 && cp <= 0x9F。
保留空格,保留一切可见字符。U+0020(空格)不在上述任何区间,所以不会被删;中文、emoji、标点、数字同理,它们的码点远高于 0x9F,过滤逻辑直接放行。因此清洗后文本的结构与可读性基本不变,只是那些躲在缝隙里的指令消失了。对于代理对(emoji 等大于 U+FFFF 的字符),其 UTF-16 代理单元码点落在 0xD800–0xDFFF,也不在删除区间,整字被完整保留。
换行是可选项。按规范,TAB(U+0009)、CR(U+000D)、LF(U+000A)都属于 C0 控制字符,默认一并删除。但很多场景下你只想去掉不可见噪声、又希望段落结构在。于是本页提供「保留换行符」开关:勾选后,只有 LF 与 CR 被放行,BEL、TAB、US 等其他控制符仍照删。开关默认关闭,即严格删除全部控制字符。
完整示例(被页面算法复算)
以本页内置演示文本走一遍。原始串是 "Hello" + BEL + "World" + TAB + "Tab" + CR + LF + "Line2" + US + "End" + DEL,其中 BEL=U+0007、TAB=U+0009、CR=U+000D、LF=U+000A、US=U+001F、DEL=U+007F 共 6 个控制字符,肉眼在输入框里看不见它们。默认严格模式下,这 6 个全部被删除,得到 "HelloWorldTabLine2End",统计显示「已删除 6 个控制字符,清洗后剩 19 个字符」。
再取文档里的短例:"A" + BEL + "B" + US + "C" + DEL,其中 BEL、US(U+001F)、DEL 三个控制字符被删,剩下 "ABC"。这条样本与上方默认示例无关,是专门用来核对过滤规则的短例,三个控制字符正好对应 C0、C0、DEL 三类。
若勾选「保留换行符」再跑同一组演示,CR 与 LF 会被放行,清洗结果变成 "HelloWorldTabLine2\nEnd"(其中 Tab 仍被删、BEL/US/DEL 被删,仅 CR+LF 保留),删除计数降为 4。所有结果都不是写死的,而是把输入逐字符代入同一套区间判定现算出来的;你换成任意自己的文本,删除数与清洗结果会立即跟着变。
对照表
对照表列出常见控制字符的名称、Unicode 码点与默认处理方式,默认显示前 12 行,点「加载更多」展开 C1 段的 6 行。前 12 行覆盖全部 C0 中最高频的成员:NUL、SOH、STX、BEL、BS、TAB、LF、VT、FF、CR、ESC 与 DEL,其中 TAB/LF/CR 标注「删除(默认)/ 保留」以对应开关行为。
这张表是固定的知识表,不是按你的输入动态生成——它告诉你「这类字符长什么样、会被怎么处理」,而不是展示某段具体文本的清洗结果。真正的逐字符判定发生在上方输入框,那里才是你文本的实算出口;两者分工明确,一个讲规则、一个做处理。
与结果区的关系是:结果区回答「我这段文本到底删了几个、剩什么」,对照表回答「控制字符家族都有哪些、默认怎么处置」。前者随输入变化,后者是恒定参考。
结果边界与舍入
- 只删三段控制区间。判定严格限定在 U+0000–U+001F、U+007F、U+0080–U+009F;空格(U+0020)与所有可见字符、emoji 一律保留,不会误伤正常文字。
- 换行是开关项。默认严格删除 TAB/CR/LF;勾选「保留换行符」仅放行 LF 与 CR,TAB、BEL 等其他控制符仍删。不要把「保留换行」理解成「保留所有空白控制符」。
- 空输入是合法状态。原文为空时删除数为 0、结果为空,不报错也不静默补零,因为本来就没有字符可处理。
- 代理对与多字节。大于 U+FFFF 的字符(如 emoji)以代理对存储,其代理单元码点不在删除区间,整字完整保留,不会被拆坏。
- 不做语义清洗。本页不去除零宽空格(U+200B 等,属空格类而非控制类)、不合并连续空白、不归一化,只针对控制字符三段;若还需去零宽字符请另行处理。
- 不联网。读取、判定、复制全部在浏览器本地完成,不发起任何网络请求,也不写 Cookie 或本地存储;你粘贴的敏感文本不会离开本机。
常见问题
为什么我复制的 PDF 文字看起来正常却总报错?
因为 PDF/Word 内部常夹带 NUL、BEL、SOH、私有控制标记等不可见字符,它们肉眼完全看不见,但进入代码或数据库后会让终端乱码、MySQL 报「Incorrect string value」、JSON 解析崩溃。把文本先过一遍本工具,再入库或贴进接口,这类问题通常立刻消失。
空格会不会被一起删掉?
不会。空格是 U+0020,不在本页删除的三段区间(U+0000–U+001F、U+007F、U+0080–U+009F)内,所以正常空格原样保留。被删的只是控制字符,可见文字与空格结构都不动。
勾选「保留换行符」后会保留 TAB 吗?
不会。该开关只放行 LF(U+000A)与 CR(U+000D)这两种换行字符;TAB(U+0009)仍属被删的控制符。如果你还想保留 TAB,本页目前没有对应开关,需要另行处理,不要把「保留换行」理解成「保留所有空白控制符」。
emoji 和中文会被误删吗?
不会。中文、英文、标点、emoji 的码点都远高于 0x9F,过滤逻辑直接放行;emoji 这类大于 U+FFFF 的字符以代理对存储,其代理单元码点(0xD800–0xDFFF)也不在删除区间,整字完整保留,不会被拆坏或丢失。
为什么示例里清洗后字符数不是肉眼看到的那么长?
因为演示文本里嵌了 BEL、TAB、CR、LF、US、DEL 等看不见的控制字符,它们占字符数但屏幕不显示。默认严格模式下这些都被删掉,所以「清洗后剩」的字符数会比你眼睛数出来的可见字母少,差值正好等于被删的控制符个数。
零宽空格(U+200B)会被删吗?
不会。零宽空格属「空格类/格式字符」,码点 U+200B 远高于 C1 上限 0x9F,不在本页删除区间内,因此会保留。若你需要清理零宽字符,要用专门的不可见字符/零宽清理工具,本页只针对控制字符三段。
复制进来的文本会被上传吗?
不会。读取、逐字符判定、复制到剪贴板全部在浏览器本地完成,不发起任何网络请求,也不写 Cookie 或 localStorage。你粘贴的敏感合同、日志、密钥文本都不会离开本机,关掉页面即清空。
DEL(U+007F)和 Backspace(U+0008)是一回事吗?
不是。Backspace 是 U+0008(BS),Delete/DEL 是 U+007F,两者码点不同但都属被删的控制字符。它们都不会出现在正常可见文本里,本页对二者一视同仁,全部按控制字符剔除,不影响你键盘上的删除键功能。