Invisible Characters in Text
Copy text out of a chat window, a PDF, or a Word document, and something you can't see almost always comes with it — a zero-width space, a stray joiner, a non-breaking space standing in for a normal one. Paste below and the counter shows exactly how many hidden characters are in there, and which ones. Free, no sign-up, nothing uploaded.
Cleaning happens in your browser: that text never leaves this page, and there is no upload, no account and no limit. Rewrite is the exception — that one sends your text to our server.
What counts as an invisible character
Anything that changes what a computer reads without changing what your eyes see. The paste above looks identical before and after — that is the whole problem. A few of the most common ones, out of the 431 named characters the tool checks for:
- Zero-width space (U+200B). No width, no glyph — but it splits one word into two as far as search, spellcheck or a CMS field is concerned.
- Zero-width joiner (U+200D). Glues emoji into one figure (👨👩👧 is three emoji held together by two of these), which is exactly why it is kept between emoji and only stripped when it turns up wedged between ordinary Latin letters.
- Word joiner (U+2060). Tells software "never break a line here" without drawing anything — it just sits there until a script trips over it.
- Soft hyphen (U+00AD). Invisible unless the word wraps at that exact point, where it turns into a hyphen no one typed. PDFs and word processors both insert these.
- Non-breaking space (U+00A0). Looks like a normal space, behaves like glue — it will not break a line and it will not match a normal space in a search.
- And the rest: Unicode tag characters (U+E0000–U+E007F, a block with no visible form at all), direction marks, variation selectors, the byte-order mark, and private-use characters. See the full list.
Where they come from
A chat assistant. ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek and Perplexity all render their replies with characters you never see: zero-width spaces between words, curly quotes, an em dash. Copy the reply and those characters copy with it. If you know which assistant your text came from, the exact list for that one is here: ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek, Perplexity. It is the same cleaner on every one of those pages — only the framing changes.
A PDF. Select a paragraph in a PDF reader and copy it, and the text layer brings its soft hyphens and non-breaking spaces along — both put there on purpose, to control where the original document broke a line. Paste that into a form field that checks its input and the soft hyphen is usually why it gets rejected.
Word or Google Docs. Autocorrect turns straight quotes into curly ones and a double hyphen into an en dash. Word's own line-breaking quietly adds non-breaking spaces and soft hyphens you never typed. None of it shows in the document. All of it can survive into a plain-text field that was not expecting it.
What the counter actually shows
Paste your text and the counter above updates as you type. It gives you a total — "Found 6 hidden characters in 240 characters" — and underneath it, a table naming each one it found and how many times: Zero Width Space, Non-Breaking Space, Soft Hyphen, and so on. Press Clean text before you look and there is nothing left to count; the counter is there so you can see what was in your text before it is gone.
What it deliberately does not do
It does not defeat AI detection, and it is not built to. A statistical watermark such as SynthID is not a hidden character you can delete — it lives in which words were picked, so the only way to remove it is to rewrite the text. The cleaner rewrites nothing: run it and your sentences come out character-for-character as you wrote them, minus the debris. (The separate Rewrite button does change your wording — that is a writing aid, and it is the one thing here that sends your text to our server.)
Questions
What exactly counts as an invisible character?
Anything that changes what a computer reads without changing what you see on screen: zero-width spaces and joiners, Unicode tag characters, direction marks, variation selectors, the byte-order mark, soft hyphens, private-use characters, and odd spaces like the non-breaking space. 431 named characters in total, plus the whole private-use block.
Does this remove the AI watermark from my text?
It removes the invisible characters — zero-width spaces, joiners, tag characters and the like — that get carried along when you copy text out of an AI assistant. It does not touch your words. Statistical watermarks such as SynthID live in the word choice itself, so no cleaner can remove those without rewriting your text - and the cleaner rewrites nothing. There is a separate Rewrite button for people who want their wording changed; that is a writing aid, not a way around detection.
Does it matter where the text came from — AI chat, a PDF, Word?
No. The tool matches characters, not sources: text copied out of ChatGPT, Claude, Gemini, Copilot, Grok, DeepSeek or Perplexity is treated exactly the same as text copied out of a PDF, Word, Google Docs or a web page. Whatever carried the character in, the cleaner finds it the same way.
Is my text uploaded anywhere?
The cleaner runs entirely in your browser: that text never leaves the page, there is no account, and there is no limit on how much you clean. The separate Rewrite button is the one exception — it sends your text to our server, which passes it to a language model. Nothing is stored either way.
Why does my text break my CMS or code editor?
Invisible characters survive a copy-paste but are not what they look like. A zero-width space inside a variable name breaks the code, a non-breaking space breaks a search, and a smart quote breaks a string literal. Nothing looks wrong on screen, which is what makes it hard to find.