How to use the Invisible Character Remover
- Paste the suspect text into Pasted text.
- Keep Replace unusual spaces (no-break, thin, ideographic …) with a normal space ticked to turn odd spaces into plain ones.
- Keep Keep joiners inside emoji (👩💻, flags, keycaps) ticked unless you want emoji split into parts.
- Check Removed, Characters before and Characters after, then read What was found to see each hidden character by name and code point.
- Copy the Clean text.
What it does and when to use it
Invisible characters take up space in your text without showing on screen. You notice them only through their effects: a login name that “should” match does not, or a script fails on a line that looks fine.
Run this tool when text copied from a website, PDF or chat app behaves strangely, when a spreadsheet lookup misses a value you can see, when a file starts with a stray BOM, or when you want to check a message for hidden markers.
The table tells you what was hiding and how many, which helps you find the program that added it. If identical-looking lines still do not match after cleaning, check spacing with Trim Lines or Remove Extra Spaces. For accents that make “café” and “cafe” differ, use Remove Accents.
How it works
The text is read one visible character (grapheme) at a time. When the emoji option is on, any grapheme that is an emoji, flag or keycap is kept whole. Every other code point is checked against a list that includes zero-width space, zero-width joiner and non-joiner, word joiner, soft hyphen, left-to-right and right-to-left marks, embeddings, overrides and isolates, invisible maths operators, Hangul fillers, the BOM, variation selectors and Unicode tag characters (U+E0000 block), which can carry hidden text. Matches are dropped and counted. Unusual spaces become a normal space, and line or paragraph separators (U+2028, U+2029) become ordinary line breaks. All of it runs in your browser.
Worked examples
Pasted price. “Price:” + no-break space + “100” + zero-width space + “€ “ + word joiner + “ok” + BOM. The result is Removed: 4, with rows for the no-break space, word joiner, BOM and Zero-width space | U+200B | 1. The clean text reads “Price: 100€ ok”.
Emoji kept. “Dev 👩💻 and flag 🇮🇳 xy” has three joiners in total, two of them inside emoji. Only the stray one between x and y goes, giving Dev 👩💻 and flag 🇮🇳 xy and Removed: 1.
Spaces left alone. “1 000” written with a no-break space, with the space option unticked, gives Removed: 0, since a no-break space is not invisible.
Limits and tips
- Removing direction marks can change how mixed Arabic or Hebrew and English text is displayed. Check the result if you work with right-to-left scripts.
- Soft hyphens are removed too; they only show when a word breaks at a line end.
- Ordinary tabs and line breaks are kept.
Frequently asked questions
Where do invisible characters come from?
What problems do they cause?
Will it break my emoji?
Why is a no-break space counted as removed?
Why does "Characters before" not match what I see?
How do we know nothing is uploaded? Test it yourself on the privacy proof page.