Strip Invisible Characters
Invisible characters sneak into text copied from web pages, documents and AI chats, and quietly break JSON, logins and search. Paste yours into the tool below and strip them — or find the tool for your exact case in the directory under it.
Every tool on this site
Clean it
Shows you where each invisible character sits before you delete it.
For a payload that will not parse.
For a spreadsheet column.
For document text.
Hunting hidden characters in a file rather than a pasted string? This scans your text for where each one sits, and gives what cat -A actually prints for all nine — including the three the usual \p{C} cleanup pattern misses.
Two strings that look the same but will not match a key? Prints the codepoint at every position where they differ, up to fifty of them, and can strip the invisible characters and compare again — nothing leaves the browser tab.
Building JSON in JavaScript? What the line and paragraph separators do to it.
Understand invisible characters
The full list of hidden characters — and what an invisible character actually does to a form field: measured, browsers reject all 128 zero-width ones in an email field.
Two unrelated things get called invisible text: format characters that measure 0.00 px and cannot be searched for at all, and the Hangul fillers most blank-text pages hand out, which are letters measuring 16.00 px each.
There is no such code point — measured across twenty candidates, only ten come off under both trim and strip.
Text that looks clean but is not empty? Tag characters hide a whole ASCII message with nothing on screen.
Unicode names twelve characters FILLER and exactly four of them are letters — U+3164, U+1160, U+115F and U+FFA0. All four paint zero pixels while reserving a full character cell, all four pass a letters-only check, and no trim will remove them.
The one invisible character that is there on purpose: it glues emoji into a single picture, and one stray copy of it flips a hundred-character text message from GSM-7 to UCS-2 and from one segment to two.
Is hidden text on a page really hidden? Measured across fourteen ways of hiding it, nine still hand the text over to select-all and copy, and only four keep it out of find-in-page — including what a redaction box in a PDF actually does, which is add 28 bytes rather than remove anything.
Names, blanks & tokens
Measured: an empty chat bubble is 16 px tall, one ordinary space leaves it at 16 px, and only 16 of 23 invisible characters get past the send button’s emptiness check.
Measured: NFKC collapses 23 blank names into 18, a trim erases 7 of them, and the pattern most username fields use refuses all 23.
Drawn rather than matched: measured in Chromium, the character in a 40 px avatar circle is 0.00 px for a zero-width space and 16.00 px for a Hangul filler — wider than the 11.00 px capital A of a real name.
A character you cannot see in a domain name? Measured: IDNA deletes U+200B, U+00AD, U+FEFF and U+2060 outright, so ap+U+200B+ple.com and apple.com resolve as the same domain.
Feeding the text to a model? The token cost of what you cannot see.
Images
Text baked into a picture? Removing it is reconstruction, not deletion: over a 228 × 46 box on a background that varies by 5, one sampled colour leaves 5 stray pixels, blurring it in place leaves 130 and interpolating leaves 2.
Writes over a box 2.98× the mark — 5,432 of the pixels it rewrites were never the mark, and drawing the box a pixel tighter writes 942 clean pixels wrong on a background where a wider box costs nothing.
What this removes
Invisible Unicode characters that survive copy and paste:
U+200Bzero width space,U+2060word joiner,U+FEFFBOMU+00ADsoft hyphen,U+034Fcombining grapheme joiner- Tag characters
U+E0001andU+E0020–U+E007F - Private use area:
U+E000–U+F8FF, plane 15, plane 16 - Interlinear annotation marks
U+FFF9–U+FFFB
Optional passes handle em dashes, exotic spaces and curly punctuation. The report below the output box lists every codepoint it removed and how many.
What this keeps by default
Some invisible characters carry meaning. Removing them would damage your text, so they stay unless you turn on aggressive mode:
U+200Dzero width joiner — holds emoji families togetherU+200Czero width non-joiner — needed for Persian, Arabic and DevanagariU+FE0Fvariation selector 16 — keeps emoji rendering as emoji- Regional indicator pairs (flags), Hangul jamo fillers, Mongolian free variation selectors, Khmer inherent vowels, Arabic and Syriac marks
U+200E/U+200Fand complete bidirectional embedding pairs
What this cannot remove
A Claude watermark has two separate layers, and this tool handles only the first one.
The first layer is invisible characters. Those are listed above, they can be found and deleted deterministically, and this tool shows you exactly what it took out.
The second layer is a statistical pattern carried by word choice itself. It is not a character you can delete — it is the sequence of words Claude picked. Removing it means rewriting the wording, which is a different job. This page does not rewrite your sentences, so it does not touch that layer. We show no removal score and no “percent human” number, because a browser-side tool has no way to verify one, and a number nobody can check is just decoration.
Supported input
- Text pasted straight into the box
- Uploaded files read as plain text:
.txt.md.markdown.html.htm.csv.json.log
Not supported: PDF, Word .docx, Pages and image files. Stripping metadata out of those needs a parsing library or a server, and this page is a single static file that runs in your browser. Rather than pretend otherwise, the file picker does not accept them.
Nothing you paste is uploaded. The cleaning runs in this browser tab.
How it works
Your text is read one codepoint at a time. Each character is checked against the removal sets above, and against the keep list, which runs first — a character that matters for emoji or for a complex script is never removed in default mode. Everything deleted is counted by codepoint, and the counts are printed in the report so you can check the work instead of trusting it.
FAQ
What is an invisible character?
A Unicode character that holds a position in your string and draws nothing on screen. Most are format characters, general category Cf. The one you almost certainly have is U+200B ZERO WIDTH SPACE: three bytes, one character, invisible, and it survives copy and paste.
How do I remove invisible characters?
Paste the text into the box and press Remove invisible characters. The characters come out, the report lists every codepoint it removed and how many of each, and you copy the cleaned text in one click. Nothing is uploaded — the work happens in this tab.
Does this remove a Claude watermark?
It removes the invisible-character layer of one. Text that comes out of Claude can carry zero-width and tag characters, and those are found and deleted deterministically. The other layer is a statistical pattern in the word choice itself, which is not a character and cannot be deleted here — that needs a rewrite, which is a different job.
Will this make my text undetectable by AI detectors?
No, and any page promising that is guessing. This removes invisible characters. It does not rewrite your wording, so the statistical pattern in the word choice stays. There is no removal score and no “percent human” number here, because a browser-side tool has no way to verify one.
Which characters does it keep?
The ones that carry meaning. U+200D holds emoji families together as one picture, U+200C is required for correct Persian, Arabic and Devanagari, and U+FE0F keeps an emoji rendering as an emoji. Those stay unless you turn on aggressive mode, which takes them out too.
Do you store what I paste?
No. There is no backend and no analytics. The cleaning happens in this tab and the text never leaves your device.
Is it free, and does it work on a phone?
Free, no sign-up, no account, no usage counter and no email wall — it is a single static page with no server behind it, so there is nothing to meter. On a phone the page is one column, the text boxes resize to the viewport, and the report table scrolls sideways instead of pushing the layout apart.