乐于分享
好东西不私藏

AI 文字“水印”不止零宽字符:我给「净字」加入了第三种处理能力

AI 文字“水印”不止零宽字符:我给「净字」加入了第三种处理能力
你可能遇到过这些奇怪的问题:
  • 从网页、PDF 或 AI 工具复制一段文字,粘贴到 Word 后排版莫名异常;
  • Excel 里的两项内容看起来完全相同,却怎么也去不了重;
  • 在文档里搜索一个明明存在的词,结果却显示“未找到”;
  • 两个用户名肉眼看不出区别,系统却把它们当成两个不同的名字;
  • 一段文字看起来很正常,字数统计却总比预期多几个字符;
  • 已经清除了隐藏字符,文本仍然呈现出明显的模型化表达和统计特征。

很多时候,不是电脑出了错。

前几种情况,往往和文字中间那些肉眼看不见、但真实存在的 Unicode 字符有关。

最后一种情况则不同。它不一定在文本中插入任何特殊字符,而可能体现在模型生成文字时形成的词汇选择和概率分布上。

最近,我把这个问题做成了一个小工具,叫做「净字」。

它最初可以一键清理文本中的零宽字符,并对部分异常的 Unicode 兼容字符进行归一化。现在,我又给它加入了第三种能力:轻度改写

目前,「净字」提供三层处理:

  1. 删除零宽字符;
  2. 对 Unicode 兼容异码进行 NFKC 归一化;
  3. 在保留原意和关键信息的基础上,对词语和句式进行轻度改写。

前两项基础清理完全在浏览器本地进行;只有你主动点击“轻度改写”时,当前清理结果才会发送到云端模型。

隐私提示:“轻度改写”不是本地功能。点击按钮后,右侧的当前清理结果会上传至 Cloudflare Workers AI 进行处理。合同、客户资料、未公开稿件、个人隐私等敏感内容,请不要使用云端改写;只使用前两项基础清理即可。

在线使用:https://rm.ai.ruixxx.com


一、看起来相同,不代表真的相同

先来看一个简单例子。

下面是两个字符串:

人工智能人工智能

肉眼看上去,它们完全一样。

但在计算机里,第二个字符串也可能是这样的:

人[U+200B]工智能

方括号里的 U+200B 是为了方便展示而加上的标记。它真正出现在文本中时没有宽度、没有形状,也不会占据一个肉眼可见的位置。

可对计算机来说,它依然是一个真实字符。

如果用 JavaScript 比较这两段文字:

const first = '人工智能';const second = '人\u200B工智能';console.log(first === second); // false

结果是 false

因为第一段文字有 4 个字符,第二段文字中间还藏着一个 U+200B。人眼忽略了它,计算机却不会。

这就是很多“看起来一样,处理结果却不一样”的来源之一。


二、什么是零宽字符?

零宽字符是一类通常不显示宽度的 Unicode 字符。

它们并不是凭空出现的“黑科技”,最初也不是专门为了添加水印而设计。有些零宽字符承担着正常的排版、连接或编码功能,在特定语言和表情符号中甚至不可缺少。

但在网页复制、富文本编辑、格式转换、自动排版或某些文本标记过程中,它们也可能被带进普通中文和英文文本。

常见的几种包括:

  • U+200B:零宽空格,英文名为 Zero Width Space;
  • U+200C:零宽非连接符,英文名为 Zero Width Non-Joiner;
  • U+200D:零宽连接符,英文名为 Zero Width Joiner;
  • U+FEFF:零宽不换行空格,也常与字节顺序标记 BOM 有关。

因为它们肉眼不可见,所以排查起来比较麻烦。

你看到的是一句正常的话,程序看到的却是一串包含额外编码的字符序列。


三、它们会造成什么问题?

1. 搜索不到明明存在的文字

假设正文里保存的是:

人工[U+200B]智能

你搜索“人工智能”时,一些使用精确匹配的程序可能无法找到它,因为正文中间实际多了一个字符。

2. Excel 去重或数据匹配失败

两行名称看起来一样,其中一行却包含零宽字符。执行去重、查找或数据关联时,它们就可能被识别为两个不同的值。

3. 程序判断两个字符串不相等

登录名、标签、文件名或数据库字段中只要多了一个不可见字符,严格比较的结果就会不同。这类问题仅靠肉眼检查通常很难发现。

4. 字数和长度统计异常

有些软件会把不可见字符计入字符串长度。因此,一段看起来只有 100 个字的文字,程序统计出来可能是 103 个字符。

5. 复制到其他编辑器后格式异常

不同软件对 Unicode 控制字符的处理方式并不完全相同。同一段文本复制到 Word、网页编辑器、代码编辑器或内容管理系统后,可能出现光标移动异常、断行奇怪或者排版不一致。

这些问题并不一定都由零宽字符造成,但当你遇到“肉眼正常、程序异常”的文本问题时,检查隐藏字符通常是一个很有效的排查方向。


四、网上说的“AI 文字水印”,其实不止一种

这两年,网上经常有人把文本中的零宽字符、异体字符、特殊 Unicode 编码乃至较高的 AI 检测概率,统称为“AI 文字水印”。

这个说法很容易传播,但并不十分严谨。

这些概念经常被混在一起,但它们背后的原理并不相同。大致可以分成三类。

1. 字符级隐藏标记

最直观的一类,是在正常文字之间插入零宽字符或其他不可见字符。

它们确实存在于字符串中,可以被程序定位和删除。「净字」的第一项能力就是处理这一类字符。

但要注意:文本中存在零宽字符,不代表这段文字一定由 AI 生成

它们可能来自:

  • 网页和富文本编辑器;
  • PDF、Word 与其他格式之间的转换;
  • 输入法或操作系统的文字处理;
  • 多语言排版;
  • 表情符号的组合;
  • 内容平台添加的技术标记;
  • 人工或程序主动插入的不可见信息。

反过来,一段 AI 生成的文字也不一定包含任何零宽字符。

2. Unicode 兼容异码

第二类,是使用全角字母、圈号字符、兼容连字或其他不常见的 Unicode 表示形式。

这类字符通常肉眼可见,却可能和常用字符具有不同的底层编码。「净字」通过 NFKC 兼容归一化处理其中一部分情况。

3. LLM 概率型水印或统计特征

第三类更加隐蔽,也更容易和普通的“AI 检测”混淆。

大语言模型每生成一个词,都不是从唯一答案中直接取出文字,而是根据上下文,在一组候选词中按概率继续生成。

一些概率型水印方法会在生成过程中,按照特定规则轻微提高某些候选词的选中概率。单独看每一个词都很自然,但当文本足够长时,检测器可能从整体词汇分布中发现统计偏差。

这种水印通常不会插入 U+200B 一类特殊字符。因此,单纯删除零宽字符或执行 Unicode 归一化,并不能改变它的核心统计信号。

与此同时,很多市面上的“AI 率检测”并不是真正在读取某种水印密钥,而是在根据句式规律、词汇分布、困惑度等特征估算文本像不像模型生成。

所以必须区分两件事:

  • 概率型水印检测:寻找生成过程中人为加入的统计偏差;
  • AI 文本分类检测:根据文本特征给出一个推测性的概率或标签。

它们都可能受改写影响,但不是同一种技术,也都不能仅凭一次检测结果准确证明文本来源。

因此,零宽字符不能被当成可靠的“AI 鉴定证据”,删除它们也不等于删除了所有所谓的“AI 痕迹”。同样,检测工具给出的百分比,也不等于在文本中发现了一个可以直接删除的实体水印。

「净字」现在处理的是三个具体问题:

清理指定的零宽字符,归一化一部分 Unicode 兼容字符,并通过可选的轻度改写调整文本表达和词汇分布。

它不是 AI 内容检测器,轻度改写也不承诺让文本通过某一个特定检测器。

我更愿意把它称作一个文本清洁、表达优化和故障排查工具


五、除了隐藏字符,还有“看起来不太对”的异码

有时问题不在于字符完全不可见,而在于它使用了另一种 Unicode 表示形式。

例如:

AIAI

第一行使用的是全角字母,第二行使用的是常见的半角拉丁字母。它们看起来相近,但底层编码不同。

类似的例子还有:

①  →  1fl  →  flA  →  A

Unicode 提供了一种叫做 NFKC 的兼容归一化方式,可以把部分兼容形式转换成更常见的标准形式。

「净字」也提供了这个选项。

不过,兼容归一化并不是简单的“删除乱码”,它可能改变某些字符原本的表现形式和语义。例如圈号数字  会变成普通数字 1

所以工具把“删除零宽字符”和“兼容异码归一化”设计成了两个独立开关。你可以根据文本用途决定是否启用。


六、第三种能力:用轻度改写调整统计分布

先强调一个重要区别:轻度改写需要调用云端 AI 模型,不是在浏览器本地完成。

只有用户主动点击“轻度改写”按钮时,工具才会把右侧的当前清理结果发送至 Cloudflare Workers AI。没有点击按钮时,粘贴、零宽字符清理、NFKC 归一化、复制和下载都不会因为这项功能自动上传文本。

如果零宽字符和 Unicode 异码属于“字符层”的问题,那么概率型水印和 AI 文本统计特征就更接近“表达层”的问题。

它们的信号可能来自:

  • 某些词汇出现得比自然状态更频繁;
  • 句式和连接方式过于规律;
  • 连续多个词的选择符合某种统计偏好;
  • 整篇文章的节奏、长度和表达变化不足。

要改变这些特征,通常不能只做字符替换,而需要重新组织语言。

常见方法包括:

  • 使用另一个模型进行同义改写,也就是 Paraphrase;
  • 替换部分表达,同时调整主动句、被动句和长短句结构;
  • 在不改变事实的前提下重新组织段落和信息顺序;
  • 使用“交叉翻译”,例如中文翻译成英文后再翻译回中文。

这些方法的共同点,是对原有词汇选择和句式结构进行重新采样。改写后的文本不再完全保留原来的生成路径,因此可能削弱原本建立在词汇概率上的统计信号,也可能改变普通 AI 分类器的评分。

这就是「净字」加入“轻度改写”的原因。

点击之后,工具会让云端模型在保留原意、事实、观点、语气和关键信息的前提下,适度替换表达并调整部分句式,同时尽量保留:

  • 数字、日期、金额和比例;
  • 人名、地名和机构名;
  • 专业术语、网址、代码和引用;
  • 原有段落、列表和 Markdown 格式。

「净字」目前采用的是直接同义改写,不是交叉翻译。相比大幅重写,它更适合已经完成内容审核、只希望让表达自然一些的文本。

不过,“可能削弱”不等于“保证清除”。实际效果会受到水印算法、检测器规则、文本长度、改写幅度和语言类型影响。有些设计更强的水印可能在多次改写后仍保留部分信号,而短文本的检测结果本身也可能非常不稳定。

所以更准确的说法是:

轻度改写会重新组织部分词汇和句式,从而改变原有统计分布,并可能降低某些概率型水印或 AI 文本特征的可检测性,但不保证满足任何特定检测工具的判定标准。


七、我做了一个免费工具:净字

为了让这类问题更容易发现和处理,我做了「净字」这个小工具。

它目前支持:

  • 删除 U+200BU+200CU+200D 和 U+FEFF
  • 使用 Unicode NFKC 进行兼容形式归一化;
  • 实时显示移除了多少个隐藏字符;
  • 一键复制清理结果;
  • 导入和下载 TXT 文本文件;
  • 单独开启或关闭两类处理;
  • 可选使用云端模型进行轻度改写,调整部分词语和句式;
  • 直接在手机和电脑浏览器中使用。

使用方法很简单:

  1. 打开「净字」;
  2. 把需要检查的内容粘贴到左侧输入框;
  3. 右侧会立即显示清理结果;
  4. 查看移除数量,确认无误后复制或下载;
  5. 如果还需要调整表达和统计特征,可以主动点击“轻度改写”。

点击前请确认:轻度改写会把当前清理结果上传至 Cloudflare Workers AI,每次最多支持 5000 个 Unicode 字符。如果内容敏感,请不要点击该按钮。

模型处理具有不确定性,完成后请重点复核人名、数字、专业术语、引用和事实信息。

在线地址:

https://rm.ai.ruixxx.com

无需注册,也不需要下载安装软件。


八、为什么我特别强调“基础清理不上传”?

文字清理工具经常会被用来处理合同、工作文档、未发布的文章、代码、客户资料或者聊天记录。

如果为了清理几个隐藏字符,就要把完整内容发送到陌生服务器,这件事本身可能带来新的隐私风险。

所以「净字」的基础清理采用纯浏览器本地处理:

你粘贴的原文、清理后的结果以及导入的 TXT 文件,都只在当前浏览器标签页中处理。

删除零宽字符和兼容归一化不需要把文本发送到服务器。下载清理结果同样在本地完成。

只有你主动点击“轻度改写”时,当前清理结果才会上传到 Cloudflare Workers AI;界面会在按钮旁明确标注“云端”和 5000 字限制。如果文本涉及合同、客户资料、未公开信息、个人隐私或其他敏感内容,请不要使用轻度改写,只使用本地基础清理。

清理逻辑同时公开在 GitHub 上,熟悉代码的朋友可以直接检查实现,也可以自己部署一份。

项目地址:

https://github.com/ruixx-tech/Remove-the-AI-watermark

对我来说,“基础清理不上传”不应该只是一句宣传语,而应该是可以从产品设计和代码中验证的事实。可选的云端功能也应该明确告知用户数据将去往哪里,而不是模糊两种处理方式的隐私边界。


九、使用之前,请留意这几个边界

为了避免误解,有几件事必须说在前面。

1. 零宽字符不一定是水印

发现零宽字符,只能说明文本中包含对应的 Unicode 字符,不能据此判断作者是谁,也不能据此判断内容是否由 AI 生成。

2. 零宽字符并非永远无意义

U+200C 和 U+200D 在部分语言文字和组合表情中有正常用途。删除它们可能改变排版、连接形式或者表情显示。

如果你处理的是多语言文本、Emoji 或对字符精确性要求很高的内容,建议保留原文,并在处理后认真比对。

3. NFKC 会改变部分字符形式

全角字母、圈号数字和兼容连字等字符可能在归一化后发生变化。如果原本的字符形式具有特殊含义,可以关闭“兼容异码归一化”。

4. 工具不会替换所有视觉相似字符

有些字符来自不同文字系统,虽然长得很像,却具有不同含义。例如西里尔字母和拉丁字母中就存在一些视觉相似的字符。

「净字」不会仅凭“长得像”就强制替换它们,以免误伤正常的多语言内容。

5. 轻度改写不是确定性的“水印擦除”

改写可以改变词汇选择、句式结构和整体统计分布,但实际效果取决于具体的水印方法和检测器。工具不保证将某个检测分数降到指定范围,也不保证通过任何平台的自动审核。

同时,检测分数降低不能证明文字变成了“人工原创”,检测分数较高也不能反向证明作者使用了 AI。判断文本来源时,写作过程、引用记录、版本历史和事实核验通常比单一检测分数更可靠。

6. 模型改写之后必须复核

虽然提示词要求保留原意和关键信息,但任何模型都可能误改数字、专有名词、引用关系或语气。用于公开发布、工作交付或专业场景前,请由作者完成最终审核,并确保自己有权处理和使用相关内容。

工具应该帮助人减少重复劳动,但不能替代必要的人工检查。


十、也许你不常需要它,但需要时会很省事

「净字」不是一个复杂的大产品。

它解决的是一个很小、很具体,却又经常让人摸不着头脑的问题:

先清理藏在字符之间的异常编码,再按需调整词汇和句式,让文本在技术层面更规范,在表达层面更自然。

如果你是编辑、自媒体作者、办公人员、程序员,或者经常需要在不同软件之间复制文字,可以先把它收藏起来。

下次遇到这些情况时,也许就能少排查半个小时:

  • 搜索不到明明存在的内容;
  • Excel 数据无法正常去重;
  • 两个字符串比较结果不一致;
  • 从网页或文档复制后格式异常;
  • 怀疑文本中混入了不可见字符;
  • 需要在保留原意的基础上,对一段文字做轻度润色和句式调整。

在线使用:https://rm.ai.ruixxx.com

开源代码:https://github.com/ruixx-tech/Remove-the-AI-watermark

如果这个工具对你有帮助,欢迎把它转发给经常处理文字、表格和代码的朋友。

也欢迎告诉我:你曾经遇到过哪些看起来正常、实际上却有问题的文字?

这些真实案例,也会帮助我继续改进它。