Invisible Character Detector
Text can carry characters you cannot see: a zero-width space (U+200B), a right-to-left override (U+202E) that reverses what follows, a no-break space (U+00A0) that looks like a normal space, or a Cyrillic "а" (U+0430) standing in for a Latin "a". Paste your text to see each one and remove it.
How to use
- Paste or type your text. The highlighted view marks every flagged character with its code point, and the summary counts them by kind.
- Check the code point table for the exact characters, how many times each appears and where it first shows up. Switch off "Only flagged" to see every code point.
- Choose what to remove or replace, pick NFC or NFKC if you want normalization, and copy the cleaned text.
How it works
The text is split into code points, not UTF-16 units, so an emoji or a character outside the Basic Multilingual Plane counts once. Each code point is matched against fixed lists: zero-width and invisible format characters (U+200B, U+2060, U+FEFF, soft hyphen, Hangul fillers), joiners (U+200C, U+200D), bidirectional controls (U+202A to U+202E, U+2066 to U+2069, the direction marks), non-standard spaces (U+00A0, U+2000 to U+200A, U+202F, U+3000 and others), control characters, Unicode tag characters (U+E0000 to U+E007F) and variation selectors.
Lookalikes are found per word. A word that mixes Latin letters with Cyrillic or Greek letters from a built-in table of lookalike pairs (for example Cyrillic а, е, о, р, с, х and Greek ο, ν, Α, Β) is flagged, because that mix is how spoofed names are built. A word written entirely in Cyrillic or Greek is left alone unless you turn on the strict option. The table is a subset of the Unicode confusables list, not all of it. Fullwidth letters and ligatures are flagged as compatibility forms when NFKC turns them into plain ASCII.
Cleaning applies your choices in one pass: delete, replace spaces with U+0020, replace lookalikes with their Latin partner, then optionally normalize. NFC recombines letters with accents and keeps the meaning. NFKC also folds compatibility forms such as fullwidth letters, circled digits and ligatures, which can change how the text looks. ZWJ, ZWNJ and variation selectors are kept by default because emoji sequences and several scripts need them.
Unicode tag characters can hide a whole ASCII sentence that most screens do not draw. When the text has any, the tool decodes them and shows what they spell. Everything runs in your browser and nothing is uploaded.
FAQ
Why does my text have characters I cannot see?
They usually come from copying out of web pages, PDFs, chat apps, word processors or AI output. Zero-width spaces mark line break points, a byte order mark sits at the start of some files, and no-break spaces replace normal spaces in typeset text.
What is the right-to-left override (U+202E) risk?
It makes the text after it display backwards. A file named "reportgnp.exe" can show as "reportexe.png". Code editors and review tools warn about bidirectional controls in source code for the same reason (the "Trojan Source" attack).
Can invisible characters be used against AI tools?
Yes. Unicode tag characters and zero-width characters can carry instructions a person does not see but a model reads. Running pasted text through this check before it reaches a prompt is a cheap safeguard, not a complete defense.
Is it safe to remove ZWJ and ZWNJ?
Not always. ZWJ joins parts of many emoji (family, profession) and ZWNJ is required to spell words correctly in Persian and some Indic scripts. They are off by default for that reason. Turn them on only for plain text where you know they are noise.
Does it catch every lookalike?
No. It checks a fixed set of common Cyrillic and Greek lookalikes plus compatibility forms. Other scripts, accented letters made to look like plain ones and punctuation lookalikes are not covered. Use it as a first check, not a full homograph test.