Home / Tools / Invisible Character Detector & Remover
Paste any text below to scan it for zero-width spaces, directional overrides, non-breaking spaces, and other Unicode characters that don’t show up on screen. The tool lists exactly what it finds, lets you choose what to remove, and gives you a clean version ready to copy back out.
Everything runs in your browser. Nothing you paste is uploaded, stored, or sent anywhere.
Each highlighted marker shows the position of one hidden character. Hover or tap a marker to see what it is.
How to Use the Invisible Character Detector
- Paste or type your text into the box above.
- Check the count and breakdown to see which hidden characters were found and how many times each appears.
- Look at the highlighted preview to see roughly where each one sits in your text.
- Review the removal options - some are switched on by default, others (like zero-width joiners) are off because they can be legitimate.
- Click Clean Text to generate a cleaned version, then Copy Clean Text to grab it.
- Use Clear to start over with new text.
What Are Invisible Unicode Characters?
Unicode sets aside a handful of code points that either carry no glyph at all or exist purely to control how surrounding text behaves. A zero-width space, for example, is a real character your computer stores and transmits, but it renders with no width and no mark, so two words separated only by one can look joined on screen even though they aren't joined in the underlying text. Others, like directional override characters, add nothing visible themselves but change how the characters around them are displayed.
Why Hidden Characters Can Cause Problems
Most of the time these characters arrive by accident: pasted out of a PDF, a Word document, a chat app, or a web page that inserted a non-breaking space or a stray byte-order mark during formatting. Once they're in your text they can throw off character and word counts, break exact-match search or string comparisons, cause CMS or code editors to show odd spacing, or make JSON and other structured formats fail to parse because of an unexpected line or paragraph separator. Directional override characters are the more deliberate case: they have been used to disguise file extensions and reorder how a string displays, which is why security-conscious tools flag them specifically.
Characters This Tool Can Detect
- Zero Width Space (U+200B) - invisible, holds no width, sometimes used to fake blank text.
- Zero Width Non-Joiner (U+200C) and Zero Width Joiner (U+200D) - control letter joining in scripts and combine emoji into single glyphs.
- Word Joiner (U+2060) - invisible, prevents a line break at that point.
- Zero Width No-Break Space / Byte Order Mark (U+FEFF) - often left at the start of a file by text editors.
- Soft Hyphen (U+00AD) - invisible unless the line happens to wrap at that exact point.
- Non-Breaking Space (U+00A0) and Narrow No-Break Space (U+202F) - look like a normal space but won't allow a line break.
- Left-to-Right Mark and Right-to-Left Mark (U+200E / U+200F) - invisible directional hints used alongside mixed-language text.
- Directional embedding and override characters (U+202A-U+202E) - force text to display in a different direction than it's stored.
- Directional isolate characters (U+2066-U+2069) - a newer, safer way to isolate mixed-direction text.
- Line Separator and Paragraph Separator (U+2028 / U+2029) - invisible line breaks that most software treats differently from a normal newline.
When You Should (and Shouldn't) Remove Them
Ordinary written text has no legitimate reason to contain zero-width controls, directional overrides, or stray byte-order marks, so removing them is almost always safe. Non-breaking spaces and narrow no-break spaces are more of a gray area: they're often intentional, keeping something like "10 km" or a name together on one line, so this tool converts them to a normal space instead of deleting them outright, which keeps your words from running together.
Zero-width joiners and non-joiners need more care, which is why they're off by default here. A joiner is what turns several separate emoji into one combined emoji, such as a family or a couple, and a non-joiner changes how adjacent letters connect in scripts used for Arabic, Persian, Urdu, and Hindi, among others. Stripping them from that kind of text can visibly change the emoji or the word. Only turn that option on if you're specifically trying to clean up joiners you know shouldn't be there.
One note on a common question: there's no reliable evidence that ChatGPT, Claude, Gemini, or similar tools secretly embed hidden tracking characters in their output as a watermark. Hidden characters do turn up in AI-generated text sometimes, but that's typically a side effect of how it was copied out of a chat interface, document, or website, not proof of a deliberate, universal watermarking scheme. If you're unsure about a specific piece of text, this tool will show you exactly what's actually in it.
Related Tools
- Invisible Text Generator - the opposite job: create genuine invisible or blank characters instead of removing them.
- Superscript/Subscript Generator - convert text into raised or lowered Unicode characters.
- Small Text Generator - turn text into tiny Unicode capitals.
- All Tools - browse every TypeGleam text generator.
- Glitch Text Generator - turn text into glitchy, Zalgo-style Unicode with adjustable intensity.
FAQ
Do ChatGPT or other AI tools secretly hide tracking characters in their text?
There's no reliable evidence of a universal hidden watermark built into AI-generated text. Hidden characters can still show up in copied AI output, but that's usually a side effect of the interface or app it passed through, not proof of secret tracking. Run your text through the tool above if you want to see exactly what it contains.
Will cleaning my text change how it looks?
Normally no. Most of the characters this tool removes are already invisible, so deleting them doesn't change the visible text at all. Non-breaking spaces and line separators are converted rather than deleted, so spacing and line breaks are preserved instead of disappearing.
Is it safe to remove zero-width joiners from emoji?
Not always, which is why that option is off by default. Removing a zero-width joiner from a combined emoji, like a family or a couple, will split it back into separate individual emoji. Only enable that checkbox if you've confirmed your text doesn't rely on joined emoji or joining scripts.
Does this tool store or upload my text?
No. Detection and cleaning both run in your browser with JavaScript. Nothing you paste is sent to a server, logged, or saved.
Why didn't it flag an emoji or accented letter as a hidden character?
Because those are normal, visible Unicode characters rather than invisible ones. The detector only looks for a specific, verified list of zero-width, directional, and spacing-control characters, so emoji, accented letters, and ordinary punctuation pass through untouched.
