Which invisible text AI models leave behind
Six characters account for nearly all of them, and U+202F is the signature. Newer ChatGPT models emit Narrow No-Break Space in place of an ordinary space, which is why the text looks normal and behaves oddly.
- U+202F Narrow No-Break Space — the most common, substituted for U+0020
- U+200B Zero-Width Space — splits words invisibly
- U+00A0 No-Break Space — also arrives via web and PDF pastes
- U+2003 Em Space — a wide space where a normal one belongs
- U+2060 Word Joiner — zero-width, prevents line breaks
- U+00AD Soft Hyphen — invisible until the line wraps
U+202F and U+00A0 both have the Unicode property White_Space=Yes, sotrim() removes them at the edges of a string and leaves every one in the middle. A trim pass therefore looks like it worked and fixes almost nothing.
These characters are not a watermark
No, ChatGPT does not watermark text with invisible characters. The characters are real and the explanation attached to them is wrong, and nearly every competing tool sells the wrong one.
OpenAI has described the behaviour as a quirk of large-scale reinforcement learning — a training artifact rather than an inserted mark. Independent forensic analysis reached the same conclusion.
OpenAI did build text watermarking and decided not to deploy it in ChatGPT, reportedly because a large share of surveyed users said they would use the product less if it shipped. The technology exists and is not in the product.
The mechanism argues against it too. A watermark that a find-and-replace removes in one second provides no attribution, and a real watermarking scheme encodes the signal in token selection, where it survives copy-editing and reformatting.
Does removing them defeat an AI detector?
No. AI detectors score statistical properties of word choice — token predictability, sentence-length distribution and vocabulary spread. An invisible character carries none of that signal.
Stripping the characters changes the byte sequence and leaves every measured feature identical. A classifier scores the cleaned text exactly as it scored the original.
Cleaning is a formatting fix. It makes the text behave correctly in code, in version control and in a CMS, and it has no effect on whether a detector flags the writing.
What the characters actually break
Four failures, all of them downstream of the paste. None appears while you are reading the output, which is why they surface late.
- Code. A U+202F inside a variable name produces an identifier that looks right and does not resolve. The error names a symbol that appears to exist. Pasted indentation containing U+00A0 breaks Python, where indentation is syntax.
- Version control. A file re-saved through an AI-assisted edit shows every touched line as changed, because the space characters differ. Review becomes impossible when the diff is entirely whitespace.
- Content systems. A CMS renders U+202F at a different width from U+0020, so published spacing does not match the draft. Justified text shows uneven gaps.
- Data and search. A U+00A0 in a numeric column makes the value parse as text, so a sum silently skips it. Exact-match search fails against text that reads correctly.
How to clean AI text hidden characters safely
To clean AI output, remove the Cf category and fold the Zs category to a plain space. Removing both outright deletes the spacing the text depends on.
Two characters need protecting. U+200D Zero-Width Joiner binds multi-person emoji into a single glyph, so stripping it splits one family emoji into four people — the scanner keeps it between pictographic characters by default. U+200C Zero-Width Non-Joiner is orthographically required in Persian, Hindi and Bengali, where removing it changes the word.
In a build pipeline, match by category rather than by codepoint, so the rule survives Unicode releases. For text from sources other than a language model — PDFs, spreadsheets, web pages — the character mix is wider; use the invisible text detector instead.