AI 文本水印:隐藏字符标记与词元选择标记
AI 文本水印有两种形式,其中只有一种由您可以删除的字符构成。
| 水印类型 | 存在位置 | 本工具可见 | 本工具可移除 |
|---|---|---|---|
| 隐藏字符标记 | 在文本字节中,以不可见或异常码位形式存在 | 是 | 是 |
| 词元选择标记 | 在词语选择本身之中 | 否 | 否 |
隐藏字符标记是文本编辑器会存储、而屏幕从不绘制的码位。
词元选择标记由模型在每一步所选的词语承载,因此没有可查找的字符,也没有可剥离的字符。如今所有标记文本输出的 AI 工具都使用这种类型。
什么使 Unicode 字符不可见?
当字符在屏幕上不占宽度时即为不可见。Unicode 用 Default_Ignorable_Code_Point 属性以及表示格式的通用类别 Cf 记录该行为。
Default_Ignorable_Code_Point 是派生属性,以纯文本列表形式发布在每个标准版本的 DerivedCoreProperties.txt 中。本清理器固定使用 Unicode 17.0(2025 年 9 月 9 日发布),该版本新增 4,803 个字符,编码总数达到 159,801。
我拉取了 Unicode 17.0 的属性数据并亲自统计。4,174 个码位带有 Default_Ignorable_Code_Point,但其中只有 405 个是已分配字符。其余 3,769 个是尚未使用的保留槽位。在这 405 个中,256 个是变体选择符,97 个位于 Tags 区块,剩下 52 个会在普通写作中出现。
同一版本中类别 Cf 有 170 个字符。这就是为什么像「104 个隐藏字符」这样的笼统营销数字本身说明不了什么。若旁边没有印出 Unicode 版本,该数字便无法对照核验。
为何词元选择水印能在字符清理后幸存?
词元选择(又称统计水印)存储在模型所选的词语中,因此删除不可见字符并不能清除统计标记。
互联网上没有任何文本水印清理器能移除词元或统计选择水印,因为 AI 工具所用算法是专有的。
ChatGPT 会在其文本中加入水印吗?
OpenAI 表示不会。2025 年 4 月 20 日,Rumidocs 报告称 GPT o3 和 o4 mini 的回复中含有 U+202F(NARROW NO-BREAK SPACE)。OpenAI 两天后回应:这些字符是「大规模强化学习的一个怪癖」,并非水印。Rumidocs 于 2025 年 4 月 23 日更新文章称特殊字符已不再出现。
OpenAI 在 2024 年确曾构建过文本水印方法,但从未上线。其当前的溯源帮助文章列出了今日携带信号的内容:图像有 C2PA Content Credentials 和 SynthID,音频有 SynthID,文本则两者皆无。同一页面写明「我们的目标是将溯源信号扩展到包括文本在内的所有模态」,这是计划而非产品。
诚实的回答很短。ChatGPT 不会给文本加水印,人们在 2025 年发现的那些字符是一个已被修复的缺陷。
在 ChatGPT 和 Claude 输出中发现的不可见字符类型
本清理器发现的字符分为五组:零宽字符、异常空格、控制字符、形似标点,以及标签或私用区字符。
| 组别 | 示例 | 作用 | 标准预设 |
|---|---|---|---|
| 零宽字符 | U+200B, U+200C, U+200D, U+2060, U+FEFF | 不占宽度,但仍存储在文件中 | 移除 U+200B、U+2060、U+FEFF,并保留两个连接符 |
| 异常空格 | U+00A0, U+2009, U+202F, U+3000 | 看起来像空格,排序和搜索时却是不同字符 | 转换为普通空格 |
| 控制字符 | C0 与 C1 范围、双向控制符 | 引导渲染或破坏解析器,从不打印 | 移除制表符和换行以外的全部 |
| 形似标点 | 弯引号、短破折号与长破折号、U+00AD | 会打印,但不是您键入的那个字符 | 保持不变 |
| 标签与私用区 | U+E0000 至 U+E007F、私用区 | 携带人类看不见的可读文本 | 移除 |
以下是我在本页每次测量中使用的运行示例。句子「The meeting starts at 9:30 am on 12 May.」在纯文本编辑器中直接键入时是 40 个字符、40 字节。经文字处理器往返一次后变成 42 个字符、49 字节。内部有前导字节顺序标记、「am」后的零宽空格,以及两个普通空格被悄悄换成 U+202F 和 U+00A0。多出九个字节。可见内容毫无变化。
The meeting starts at 9:30 am on 12 May.零宽字符:U+200B、U+200C、U+200D、U+2060 和 U+FEFF
零宽字符在屏幕上不占空间,但仍存在于文件中,因此粘贴的文本可携带无人可见的标记。
| 码位 | 官方 Unicode 名称 | 实际作用 |
|---|---|---|
| U+200B | ZERO WIDTH SPACE | 标记换行机会,主要由网页编辑器插入 |
| U+200C | ZERO WIDTH NON-JOINER | 在波斯语和阿拉伯语词中使字母保持分离 |
| U+200D | ZERO WIDTH JOINER | 将表情连接为一张图,并在印度系文字中形成合字 |
| U+2060 | WORD JOINER | 阻止在该处换行 |
| U+FEFF | ZERO WIDTH NO-BREAK SPACE | 字节顺序标记,通常由文本编辑器留下,而非 AI |
这五个中有两个是有效工作字符,而非垃圾。U+200C 和 U+200D 在真实语言中承载意义,这正是标准预设原样保留它们的原因。
异常空格:U+00A0、U+2009、U+202F 和 U+3000
异常空格看起来像普通空格,但码位不同,从而破坏搜索、排序和代码。
Unicode 17.0 在 Zs 类别(空格分隔符)中定义了 17 个字符,其中只有一个是键盘上的空格。我从字符数据库列出了全部 17 个及其 UTF-8 字节宽度,因为字节宽度正是它们成本高昂的原因。
| 码位 | 官方 Unicode 名称 | UTF-8 字节 |
|---|---|---|
| U+0020 | SPACE | 1 |
| U+00A0 | NO-BREAK SPACE | 2 |
| U+1680 | OGHAM SPACE MARK | 3 |
| U+2000 to U+200A | EN QUAD 至 HAIR SPACE,共 11 个字符 | 各 3 字节 |
| U+202F | NARROW NO-BREAK SPACE | 3 |
| U+205F | MEDIUM MATHEMATICAL SPACE | 3 |
| U+3000 | IDEOGRAPHIC SPACE | 3 |
单个 U+202F 占三个字节,而空格只占一个;当间隙是 U+202F 时,搜索「9:30 am」将无法匹配「9:30 am」。这种不匹配正是即使在标准预设中也要规范化空格的原因。
9:30 am
9:30 am您可以将上方样例文本复制粘贴到工具输入框中查看结果。
编辑器插入的破折号、智能引号与软连字符
弯引号、长破折号和软连字符 U+00AD 通常来自文字处理器的自动更正设置,而非语言模型。
Unicode 17.0 将 Dash 属性赋予 31 个字符,从键盘上的普通 U+002D 到 U+2014 EM DASH 和 U+2E3A TWO-EM DASH。其中只有一个是键盘按键。其余在软件「猜测您的意图」时出现。U+00AD 是例外:仅在该处断行时打印为连字符,其他地方保持不可见。
破折号是把大多数人带到这类页面的问题,而简短回答是:它们什么也证明不了。完整论述见下文关于长破折号的章节。
在文本中隐藏指令的标签与私用区字符
Unicode Tags 区块中的字符(U+E0000 至 U+E007F)可携带人类读者永远看不见的完整句子。攻击者正是以此将隐藏指令偷运进 AI 助手稍后会阅读的文本。
AWS Security Blog 于 2025 年 9 月 30 日报道了 Unicode 字符走私。文中描述标签字符「最初设计为指示文本内语言的不可见标记」,现已「成为提示注入的潜在载体」。Cloud Security Alliance 于 2026 年 3 月 10 日的研究笔记将同一手法追溯到 AI 代理技能、工具描述和 MCP 服务器。该工作将 Tags 区块与 U+200B、U+200C、U+200D 和 U+FEFF 一并点名。
我构建了一个示例以查看其规模。可见句子「Great work on the report.」是 25 个字符、25 字节。我追加了一段用标签字符编码的 42 字符指令。文件增至 67 个字符、193 字节。屏幕上仍读作五个词加一个句号,而脚本能从副本中完整抽出指令。每个标签字符占四个字节、零像素。
Great work on the report.这是清理与 AI 检测无关的文本的最强理由。把网页上的一段文字粘贴进聊天助手,您可能正在把从未键入的指令交给它。
在浏览器中移除不可见字符:扫描与清理流程
本清理器在您粘贴文本的瞬间扫描,列出每项发现及其官方 Unicode 名称和位置,在您按下「清理文本」之前不做任何更改。
流程有四个步骤:
- 粘贴文本,或拖入 .txt 或 .md 文件。
- 审查发现列表,其中标明每个字符及其位置。
- 选择预设,或保留您想保护的单项发现。
- 清理,然后复制结果或下载。
本清理器不会改写、释义或「人性化」您文本中的任何一个词。
标准、高级与严格预设对比
「标准」移除正常写作中会出问题的字符,「高级」扩大范围,「严格」移除最多。
| 字符组 | 标准 | 高级 | 严格 |
|---|---|---|---|
| 零宽空格、词连接符、字节顺序标记 | 已移除 | 已移除 | 已移除 |
| 双向控制符与 C0/C1 控制符 | 已移除 | 已移除 | 已移除 |
| Tags 区块与私用区字符 | 已移除 | 已移除 | 已移除 |
| 软连字符 U+00AD | 已移除 | 已移除 | 已移除 |
| Zs 类别中的异常空格 | 转换为 U+0020 | 转换为 U+0020 | 转换为 U+0020 |
| 连接符 U+200C 和 U+200D | 已保留 | 表情序列外移除 | 处处移除 |
| 变体选择符 | 已保留 | 表情序列外移除 | 处处移除 |
| 弯引号与长破折号 | 已保留 | 已保留 | 转换为直引号和普通破折号 |
预设旁还有三个一键筛选:删除不可见字符、移除破折号和连字符、移除表情符号。公开这些规则是有意为之。所有竞品都把规则集藏在单一按钮后面,因此在出问题之前您无法知道它从文本中拿走了什么。
Markdown 代码保护如何保持代码块完好?
开启 Markdown 模式与保护后,清理器会跳过围栏代码与行内代码,因此需要精确字符的片段得以保留。
代码是散文中所谓「垃圾」字符却起承重作用的唯一场所。正则表达式或测试字符串可能依赖字节顺序标记恰好位于某处。
您的文本会离开设备吗?
不会。扫描与清理都在您的浏览器中运行,页面从不上传或存储您的文本。
诚实的另一半也应一并说明。本页免费,因此仍可能显示广告并使用网站分析。可选的 JSON 报告记录变更内容,但不包含您的任何文本。
文本与文件限制:20,000 词与 1 MB
清理器接受最多 20,000 词的粘贴文本,或一个最大 1 MB 的 UTF-8 文件(.txt 或 .md 格式)。
其他均不在范围内:不支持 HTML、DOCX、PDF、JSON 或 CSV,粘贴仅以纯文本到达。需要 JavaScript。无账户、无付费。界面提供 26 种语言。官方 Unicode 名称在所有语言中保持英文,因为翻译后的字符名不再是可引用的名称。
若处理的是照片而非文本,您可以 从图片中移除 AI 信息 或 编辑图片元数据.
按厂商的 AI 文本标记:ChatGPT、Claude、Gemini 与 Grok 对比
只有部分 AI 厂商会标记其文本输出,而凡是这样做的厂商都使用词语选择而非隐藏字符。
| 厂商 | 标记文本 | 方法 | 本清理器可发现 | 来源与日期 |
|---|---|---|---|---|
| Anthropic, Claude | 是 | 词元选择水印,一种 SynthID Text 变体 | 否 | Anthropic,2026 年 8 月 11 日公告,2026 年 8 月 14 日技术说明,2026 年 9 月 1 日更新 |
| Google, Gemini | 是 | SynthID Text,词元概率调制 | 否 | Google DeepMind,2024 年 5 月 14 日,同年晚些时候开源 |
| OpenAI, ChatGPT | 无已确认的文本水印 | 文本生产环境中无。图像携带 C2PA 和 SynthID,音频携带 SynthID | 不适用 | OpenAI 溯源帮助文章,截至 2026 年 9 月 2 日现行 |
| xAI, Grok | 无已公开承诺 | 未说明 | 不适用 | xAI 未签署委员会透明度实践准则,报道于 2026 年 8 月 12 日 |
Anthropic 表示,2026 年 8 月 2 日及之后发布的模型在发布时即带有标记。该公司正致力于为该日期前发布的模型添加标记。文本水印检测不是公开检查器。Anthropic 称检测「目前处于私有预览,按欧盟法律要求向合格组织开放」。合格名单包括监管机构、执法、媒体、事实核查者、研究人员、教育机构以及欧盟公民社会组织。Anthropic 另提供的免费 Claude Content Checker 读取生成文件上的 C2PA Content Credentials,这与文本水印是不同的事物。
xAI 未签署实践准则并不使 Grok 免于《人工智能法案》本身。自愿准则是合规路径,而非法律的替代品。
Claude 文本水印如何工作?
Claude 在同等合适的词语之间做选择,由密钥决定取哪一个。标记是选择序列,而非文本中的任何字符。
Anthropic 对机制表述清楚。「水印不是用任意随机数生成器挑选下一个词,而是用密钥以及前面几个词来确定模型应选哪个词。」公司还称 Claude 的文本水印「是 Google DeepMind 在 2024 年 Nature 论文中发表的 SynthID-Text 方法的一个版本」。
关于鲁棒性,Anthropic 表述具体。「轻度编辑大概无法完全移除水印」,而每个词都被替换的完全重写则会移除它。
SynthID Text 在 Gemini 输出中标记什么?
SynthID Text 在 Gemini 写作时将模式嵌入词元概率。Google DeepMind 于 2024 年 5 月 14 日宣布为 Gemini 应用和网页体验提供 SynthID 文本水印。该方法「通过在生成点调制词元被生成的可能性,在词元分布中引入额外信息」来工作。DeepMind 同年晚些时候通过其 Responsible Generative AI Toolkit 开源了该方法。
已公布的局限与方法本身同样重要。SynthID Text 在较长、较多样的回答上效果最好。在模型几乎没有措辞自由度的短事实回复上表现较差。当文本被彻底改写或翻译时,置信度会再次下降。
隐藏字符发现与 AI 作者身份:为何二者永不相证?
隐藏字符证明有东西处理过您的文本,而非证明由 AI 撰写。
每个不可见字符都有早于 AI 写作存在的普通解释。文字处理器、内容管理系统和 PDF 导出器数十年来一直在插入它们。一项发现告诉您文本经过了软件——几乎任何人发表的每一句话都是如此。
除 AI 外,不可见字符还来自哪里?
文字处理器、网页编辑器、PDF 导出、翻译工具、聊天应用,以及普通的复制粘贴,都会自行插入不可见字符。
| 来源 | 常添加的字符 | 原因 |
|---|---|---|
| 文字处理器 | U+00A0, U+2019, U+2014, U+00AD | 自动更正与自动断字 |
| 网页与 CMS 编辑器 | U+200B, U+FEFF | 换行提示与文件编码标记 |
| PDF 导出 | U+2009, U+202F, U+00A0 | 将文本复制出来时保留排版间距 |
| 翻译与本地化工具 | U+200C, U+200D, U+061C | 正确渲染阿拉伯语、波斯语和印度系文字 |
| 聊天与消息应用 | U+200D, U+FE0F | 表情序列以及文本或表情呈现 |
| 应用间的复制粘贴 | U+FEFF、混合的 Zs 空格 | 剪贴板处的编码转换 |
我自己那句 40 字节的测试句在从未接触语言模型的情况下就检出了四项发现。这就是用一次测量讲完的全部论证。
为何长破折号不是水印
长破折号是作家、编辑和自动更正使用了几个世纪的普通标点,因此不携带关于谁写了句子的任何信号。
2025 年的修复盖棺定论。OpenAI 于 2025 年 11 月 14 日表示,ChatGPT 终于会遵守要求其停止使用长破折号的自定义指令。Sam Altman 当天直言:「如果你在自定义指令中告诉 ChatGPT 不要使用 em-dashes,它终于会按要求去做。」用户能在个性化设置中关掉的习惯从来不是标记。它是训练中学到的风格模式,修复只是一项偏好。
本清理器仍提供破折号移除,理由坦率。它是给希望文稿中使用直引号和普通破折号的人的风格筛选。它不是水印筛选,也不会改变任何检测器对您文本的判断。
清理何时会破坏文本:波斯语、阿拉伯语、印度系文字与表情
移除零宽字符可能破坏正确文本,因为某些文字需要它们才能正确拼写词语。
我运行了最常出问题的四个案例并精确记录结果。波斯语词 میخواهم 有八个字符,中间的 U+200C 使两部分不发生连写。删除它得到 میخواهم,七个字符且书写形式不同。在天城文中,क्ष 含有形成正确合字的 U+200D,剥离后屏幕上的形状会改变。家庭表情 👨👩👧👦 是七个码位,由三个 U+200D 连接符把四张图连在一起。移除连接符会拆成 👨👩👧👦 四个独立人物。红色心形 ❤️ 携带 U+FE0F 以渲染为表情;没有它,同一码位回退为文本符号 ❤。
这就是工具在清理前显示发现、可单独保留命中项、以及「严格」不是默认的原因。只处理一种语言的编辑者看到的是干净结果;处理六种语言的编辑者看到的是缺陷报告。
关于 AI 文本水印清理的最终结论
清理不可见字符值得做,以获得干净、可移植、安全的文本。
运行此工具有两个理由。第一,隐藏字符会在搜索结果、电子表格查找、代码和 URL 中悄无声息地出问题。第二,标签字符可将无人键入、无人可见的指令带入 AI 助手。这使得清理成为安全习惯,而非表面修饰。
任何希望击败厂商水印的人,清理的是错误的一层。Claude 和 Gemini 在词语选择中标记文本,OpenAI 标记图像和音频但不标记文本,无论剥除多少字符都触及不到它们。击败这些统计水印的一种方式是把文本翻译成几种不同语言,再译回原文。
把您自己的一页文本粘贴到上方输入框,阅读发现结果以更好地理解文本,或直接复制输出。
就到这里。感谢您读到这里。