Clean a text, character by character or word by word
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, here, in your browser. And if the mark you are after is not a character at all but the choice of words itself, one further option rewrites those words.
Text cleaner
Nothing to preview yet.
Point at a marker to see exactly which character it is.
- invisible
- exotic space
- bidirectional control
- typographic punctuation
- styled letter
- 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
Rewrite a whole text file — part of your subscription
A .txt or .md file is read here in your browser; its text is rewritten through the same option above, and the result downloads back with its formatting markers untouched. Word documents are not accepted: rewriting replaces the words themselves, and stitching new words into a .docx risks a file that will not reopen — save it as .txt or .md first.
Start from
These rewrite characters you can see
A subscription rewrites up to 100,000 words per month right here — 2.99 EUR a month or 29.99 EUR a year — and adds .txt and .md file rewriting. Prefer no subscription? The desktop application rewrites whole documents, in batches, with 50,000 words included in the one-off licence.
Cleaning happens here. Rewriting is the one exception, and it is off
until you switch it on.
The cleaner is a small JavaScript module loaded once with the page, and it runs on
your own machine: no upload, no server, nothing involved in the inspection or in
removing a single character. Open your browser's network panel and clean
something — the list stops growing. Or load this page, switch your network
off, and keep cleaning. Spell checking is switched off on the box above as well,
so the browser does not hand your text to a spelling service.
The rewrite option is different, and we would rather write it
here than let you discover it: choosing different words needs a language model,
which cannot run in this page. Switching it on sends the text in the box to our
server, which passes it to the model provider named in our
privacy policy and sends the answer back. We keep no
copy of it, no fragment, no hash and no result — only a count of words. Leave
that switch off and this page still sends nothing at all.
This page carries no advertising and no third-party script; other pages of this
site may.
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 six 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 |
| Styled letters | Fake bold and italic (U+1D400 onwards), full width letters (U+FF21 onwards), script and fraktur | Letters that look styled but are entirely different characters |
The first three classes are on by default because removing them does not change a single visible glyph. The last two are off by default, and stay off until you decide otherwise: replacing a curly quote with a straight one is an edit to your writing, not a cleanup.
Styled letters deserve a word of their own. A word written as 𝚫𝚮𝚵𝚵𝚸 is not “Hello” in bold: it is five completely different code points, borrowed from the block Unicode reserved for mathematical notation. Nothing on screen tells you apart from real bold text, but an exact search for “Hello” will never find it, a spell checker cannot read it, and a filter looking for a word will walk straight past. The same is true of the full width forms, which come from Japanese typesetting. Folding them back gives you ordinary letters again — and because mathematical notation uses some of those same code points, that switch stays off until you ask for it.
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 cleaning 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.
The one exception is the rewrite option, and we would rather write it here than let you discover it in that same network panel: choosing different words is the model's job, so that option — and only that option — sends your text through our server to the AI vendor named in the privacy policy, which also says what each side keeps. Cleaning alone triggers no request at all.
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.