Hidden Characters in AI Text: Where They Come From and How to Find Them
Updated September 2026
Text that looks clean is not always clean. Between the letters you can see there is room for characters you cannot: spacing controls, direction markers, glyph selectors and an entire alphabet that renders as nothing. They arrive through copy and paste, through chat interfaces, and sometimes on purpose. Here is what they are, what they break, and how to remove them without collateral damage.
Quick answer
The characters most often found in AI and web text:
- 1Zero-width space U+200B, zero-width joiner U+200D and word joiner U+2060: invisible, survive copy and paste, the classic fingerprint carriers.
- 2Non-breaking space U+00A0 and narrow no-break space U+202F: look like spaces, are not, break search and code.
- 3Directional marks U+200E, U+200F and overrides U+202A to U+202E: can reorder or hide text.
- 4Tag characters U+E0000 to U+E007F: an invisible copy of ASCII, used to smuggle text past human readers.
- 5Look-alike letters: Cyrillic а, е, о, р, с and Greek ο standing in for Latin letters.
Scan first, then strip. The tool below lists every one by code point and shows where it sits.
Where they come from
| Source | What it leaves behind | Deliberate? |
|---|---|---|
| Web pages and PDFs | Soft hyphens from justified text, non-breaking spaces, byte order marks, directional marks around mixed-language snippets | No |
| Word processors and email | Non-breaking spaces, curly quotes, em dashes, the occasional zero-width space from autocorrect | No |
| Chat interfaces | Narrow no-break spaces and typographic punctuation; in 2025, U+202F in some ChatGPT model output, described by OpenAI as a training quirk | Not as far as anyone has shown |
| Document fingerprinting | A unique pattern of zero-width characters per recipient, so a leaked copy can be traced | Yes |
| Prompt injection and filter evasion | Tag characters carrying hidden instructions; look-alike letters that slip past keyword filters | Yes |
What they break
- Search and matching. A non-breaking space is a different character from a space. Two strings that look identical do not match in a database, a spreadsheet or a find box.
- Code. A curly quote in a string literal is a syntax error. A zero-width space inside an identifier makes two variables with the same visible name. Narrow spaces inside numbers turn them into text.
- Diffs and reviews. A line with an invisible change looks unchanged but shows as modified, and the reviewer cannot see why.
- Privacy. A fingerprint pattern identifies the copy, and therefore the recipient, no matter how the words were edited around it.
- Safety. Hidden instructions in tag characters ride into whatever AI tool the text is pasted into next.
The ChatGPT space episode
In April 2025, users and at least one research group documented that outputs from some then-current ChatGPT models contained narrow no-break spaces (U+202F) in places a keyboard would never put them. The pattern was regular enough to look intentional. OpenAI's response, reported at the time, was that the characters were a side effect of large-scale training rather than a watermark, and that it would be addressed. Whatever the cause, the episode made a general point: text that comes out of a model has been through a pipeline you did not control, and scanning it before you rely on it is reasonable.
Hidden characters are not the statistical watermark
Vendors that watermark text at the model level, the approach Google published as SynthID-Text and the class Anthropic describes for Claude, do it through word choice, not characters. Cleaning hidden characters does not touch that mark, and a scan that finds none does not mean the text is unmarked. The two problems are separate, and only the character problem has a certain fix.
How to clean without breaking things
The naive approach, delete every character in the Unicode format category, destroys legitimate text. The joiner between the members of a family emoji, the selector that turns ✔ into an emoji, the tag characters that spell out a regional flag, and the non-joiner that keeps a Persian word from mis-shaping are all format characters with jobs. A good cleaner looks at the neighbours: a joiner between two emoji stays, a joiner between two Latin letters goes. StripShot's cleaner is adapted from the MIT-licensed watermarks-remover project, which encodes exactly those rules, and every removal it makes is listed so you can check its work.
Spaces get normalized rather than removed, look-alike letters are swapped back to Latin only if you turn that option on, and typographic punctuation is optional too, because sometimes you want your curly quotes. The re-scan after cleaning shows the count at zero, which is the only proof that matters.
Scan your text
Find every hidden character in a paste
Runs in your browser. Nothing is uploaded.
Options
Need unlimited strips?
Scans are free. Pro is unlimited.
Images, video, audio, documents, PDF and text in one tool. Pro adds unlimited strips, whole-folder batches and zip download with a JSON report.
Frequently asked questions
Why does ChatGPT text have weird spaces in it?
In April 2025 several people documented narrow no-break spaces (U+202F) in output from some ChatGPT models. OpenAI described it as a training side effect rather than a watermark and said it would be addressed. Separately, chat interfaces and rich-text editors routinely emit non-breaking spaces (U+00A0), curly quotes and em dashes, which are typographic rather than hidden but cause the same search and code problems.
Are hidden characters a watermark?
They can be. A deliberate pattern of zero-width characters is the classic way to fingerprint a document so a leaked copy can be traced. Most hidden characters in everyday text are accidental copy residue, though, and you cannot tell the difference by looking. You can tell by scanning.
What is ASCII smuggling?
Unicode has a block of tag characters (U+E0000 to U+E007F) that mirror ASCII but render as nothing. Text written in them is invisible to a reader and legible to a language model, which makes them a vehicle for hiding instructions inside otherwise normal text. Any text you paste into an AI tool from an untrusted source is worth scanning for them.
Will removing hidden characters break my emoji or my Arabic text?
A careless cleaner will. A family emoji is four emoji glued with zero-width joiners; a flag is a base plus tag characters; Persian and Hindi words need joiners and non-joiners to shape correctly. StripShot keeps every one of those by checking what sits on either side of the character, and removes only the free-floating ones.
How do I see hidden characters in my text?
Paste it into the tool on this page and click Scan. Each hidden character is listed by code point and count, and the highlighted view shows exactly where each one sits before anything is changed.