Strip Invisible Characters
Working with hidden characters? Try the
zero-width space remover, which shows you where
each invisible character sits before you delete it, or the
JSON cleaner if it is a payload that will not parse, or the
Excel cell cleaner for a spreadsheet column, or the Word and Docs cleaner for document text.
Full list of hidden characters: invisible Unicode characters.
Feeding the text to a model? What hidden characters cost you in tokens.
Building JSON in JavaScript? U+2028 and U+2029.
Text that looks clean but is not empty? Unicode tag characters
hide a whole ASCII message with nothing on screen.
Want to know 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 that most
blank-text pages hand out, which are letters measuring 16.00 px each.
Looking for an empty character? There is no such code point, and
measured across twenty candidates only ten come off under both trim and strip.
Want to send a blank text message? 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.
The zero-width joiner is 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.
Hunting hidden characters in a file rather than in a pasted
string? That page scans your text for where each one sits, and gives what cat -A
actually prints for all nine — measured, including the three the usual
\p{C} cleanup pattern misses.
Wondering whether hidden text on a page is 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.
Need an invisible letter rather than an invisible character?
Unicode names twelve characters FILLER and exactly four of them are letters — U+3164,
U+1160, U+115F and U+FFA0. Measured: all four paint zero pixels while reserving a full
character cell, all four pass a letters-only check, and no trim will remove them.
Two strings that look the same but will not match a key? The
text comparison prints the codepoint at every position where they
differ, up to fifty of them, and can strip the invisible characters and compare again to tell
you whether that was the whole difference — nothing leaves the browser tab.
After an invisible username? Measured: NFKC collapses 23 blank
names into 18, a trim erases 7 of them, and the pattern most username fields use refuses all 23.
An invisible nickname is 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 — and a character on the end of the name changes neither the avatar nor the
letter.
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, while a look-alike letter is encoded to
xn-- and two characters get three different answers from Python, Node and Chromium.
Text baked into a picture rather than a page? Removing
text from an image is reconstruction, not deletion, and the
same measurement answers both directions: over a 228 × 46 box on a background that varies by
5, one sampled colour leaves 5, blurring it in place leaves 130 and interpolating leaves 2, while
text drawn 1/255 away from a flat background still occupies all 2,745 of its pixels. Clearing a
mark off a photo rather than text off an image? The
watermark remover 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.