Remove invisible characters from text
Paste anything. Every zero width space, hidden Unicode character, unusual space and direction mark is listed with its code point, its position and how many times it occurs — then removed if you say so. The text stays in your browser.
Text cleaner
Nothing to preview yet.
Point at a marker to see exactly which character it is.
- invisible
- exotic space
- bidirectional control
- typographic punctuation
- kept on purpose
Loading the in-page cleaner…
Positions count characters from the start of the text, the first character being number 1. An emoji counts as one character, however many bytes it takes to store.
Kept on purpose, not removed
Your text never leaves this page. The cleaner is a small JavaScript module loaded once with the page, and it runs on your own machine. Once the page has loaded, it sends no request at all: no upload, no server, nothing involved in the inspection or the cleaning. The only requests are the ones that fetched the page itself, and none of them can carry your text — they were finished before you typed it. Open your browser's network panel and clean something: the list stops growing. Or load this page, switch your network off, and keep working. This page carries no advertising and no third-party script — other pages of this site may. Spell checking is switched off on the box above as well, so the browser does not hand your text to a spelling service.
What this page claims, and what it does not
We remove the exact characters belonging to the classes you switch on, and we report how many of each one we took out. That claim is verifiable in ten seconds: paste the result back into the box and every class you switched on reads zero. Classes you left off still read their real count — we keep telling you what is there, even when you asked us not to touch it.
Everything else is outside what we can measure. We say nothing about what another tool, a service or a person will conclude from your text. We say nothing about characters or patterns that fall outside the four classes listed above — if we do not recognise something, we leave it alone and we do not pretend it is absent. The counts are the whole of the claim.
What invisible characters are
Unicode contains characters that occupy a position in a string but draw nothing on screen. A zero width space (U+200B) separates two words without a visible gap. A zero width joiner (U+200D) glues symbols together. A byte order mark (U+FEFF) is a leftover from how a file was encoded. A soft hyphen (U+00AD) marks where a word may break, and shows up only when it does. None of them are visible, all of them are really there, and every one of them is counted by your editor, your character limit and anything that compares two strings.
Where hidden Unicode characters come from
Almost always from ordinary copying and pasting. Word processors and page layout tools insert no-break spaces to keep a number attached to its unit. Web pages use zero width spaces to control where a long address wraps. Content management systems replace straight quotes with curly ones. Text that has travelled through a right-to-left language keeps direction marks. Exports from spreadsheets carry a byte order mark at the very start of the file. Nothing here is unusual and nothing here is sinister — it is simply text that has been through several programs.
The nuisance is real all the same: a hidden character breaks an exact search, adds to a character count, corrupts a comparison between two supposedly identical strings, breaks a lookup key, and turns a copied code snippet into a syntax error.
What this tool removes, exactly
Four classes, each behind its own switch. The list of code points lives in the engine, and the tool reports the ones it actually found in your text rather than the ones it knows about.
| Class | Examples | How it looks on screen |
|---|---|---|
| Invisible | U+200B zero width space, U+200C and U+200D joiners, U+FEFF byte order mark, U+00AD soft hyphen | Nothing at all |
| Exotic spaces | U+00A0 no-break space, U+2009 thin space, U+202F narrow no-break space, U+3000 ideographic space | Like an ordinary space, but it is not one |
| Bidirectional controls | U+200E and U+200F direction marks, U+202A to U+202E embedding and override | Nothing, but they can change the order characters are displayed in |
| Typographic punctuation | Smart quotes, en and em dashes, the ellipsis character, primes | Visible punctuation — switching this on changes what your reader sees |
The first three classes are on by default because removing them does not change a single visible glyph. The fourth is off by default, and stays off until you decide otherwise: replacing a curly quote with a straight one is an edit to your writing, not a cleanup.
Some invisible characters are load-bearing, and those are kept. A zero width joiner between two emoji is what makes them a single picture; the same character is grammatically required in Persian and in several Indic scripts; a variation selector after a base character is how emoji presentation is written. When the engine keeps one of these it says so, under Kept on purpose, with the reason — rather than deciding in silence.
Kept is not the same as harmless, and the page does not pretend otherwise: those code points are still in your text, they are counted, and they are named. A text can therefore come back with nothing to remove and still carry invisible characters. A separate switch, inside that same box, removes them too — it is off by default because it is the one setting that can split a composed emoji in two or change how a word is spelled.
Not every mark lives in a character — how the other kind works
Everything above concerns marks made of characters: a code point is present, or it is not. That is why this page can count them, name them, and show you their position — and why running the result back through the box reads zero. It is arithmetic, and you can check it.
There is a second family, and it works on a completely different principle. Rather than adding anything to the text, the model is nudged while it writes: at each step it has several words that would do, and the choice between them is skewed by a secret key. No single word looks unusual. Across a few hundred of them, the pattern of choices is measurable by whoever holds the key. Google published this approach for text as SynthID-Text in Nature in 2024; Anthropic announced in August 2026 that Claude marks its text output, without publishing the method.
Two consequences follow, and they are worth understanding.
The first is that this tool does nothing to that family, and cannot. The signal is not in a character we could remove; it is in which words were picked. Deleting a zero width space leaves it exactly as it was. Any tool claiming otherwise is describing something it has not measured.
The second is that, because the signal is spread thinly across the word choices themselves, only rewriting the text touches it — that is, choosing different words. Correcting a typo or moving a comma leaves the pattern intact, which is exactly what this design is for. The published research on SynthID-Text reports that paraphrasing, translation and heavy editing degrade detection substantially, while light editing does not.
What we will not tell you is what that means for any particular text. Neither Anthropic's mark nor SynthID-Text has a detector any third party can run, so nobody outside those companies can measure a before and an after — including us. We can count characters. That is the whole of what this page claims, and we would rather explain the boundary than blur it.
Why the text never leaves your browser
Most tools of this kind post your text to a server, clean it there and send it back. That means the text was on someone else's machine, and you have only their word for what happened to it next. Here the cleaning code is loaded with the page and runs on your own machine, exactly like the desktop application.
You can check that without trusting us. Open the network panel of your browser and reload this page: you will see the requests that build the page — the page itself, its style sheets, its icon and its scripts. Then paste your text and clean it. No further request appears, and none of the earlier ones can hold your text, because they had all finished before you typed a character.
This page carries no advertising and no third-party script either, and that too is a decision rather than an accident. A script served by somebody else can read everything on the page it runs in, which here would mean the text you pasted. Other pages of this site may show advertising; this one does not.
Files carry the same kind of thing
A photo or a document records far more than a hidden space: the coordinates where it was taken, the camera and its serial number, the software that touched it, the name of the author. The same principle applies — read it first, then remove exactly what you choose.