Find and remove invisible characters from pasted text

Paste text that behaves oddly and the tool removes hidden characters such as zero-width spaces and byte order marks, then lists each one it found with its code point.

Live demo · real result from this tool
Removed4
Characters before
64
Characters after
61

What was found

CharacterCode pointCount
Zero-width spaceU+200B1
No-break spaceU+00A01
Soft hyphenU+00AD1
Byte order mark (zero-width no-break space)U+FEFF1

Clean text

Hello world with asoft hyphen and a BOM. Emoji stay intact: 👩‍💻

Processed on your device — nothing is uploaded.

How to use the Invisible Character Remover

  1. Paste the suspect text into Pasted text.
  2. Keep Replace unusual spaces (no-break, thin, ideographic …) with a normal space ticked to turn odd spaces into plain ones.
  3. Keep Keep joiners inside emoji (👩‍💻, flags, keycaps) ticked unless you want emoji split into parts.
  4. Check Removed, Characters before and Characters after, then read What was found to see each hidden character by name and code point.
  5. 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 🇮🇳 x‍y” 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?
Web pages, PDFs, word processors, chat apps and some AI tools insert them for layout, line breaking or text direction. A byte order mark (BOM) often starts files saved by Windows programs.
What problems do they cause?
Two words that look the same no longer match, so searches, spreadsheet lookups and duplicate checks fail. Code can stop compiling, a password or coupon can be rejected, and character counts come out higher than what you see.
Will it break my emoji?
No, not with the default settings. Many emoji, such as 👩‍💻, flags and keycaps like 1️⃣, are built with joiners or selectors. With "Keep joiners inside emoji" ticked, these are left alone. Untick it and 👩‍💻 splits into 👩 and 💻.
Why is a no-break space counted as removed?
It is replaced, not deleted. With the unusual-spaces option on, no-break, thin, em and ideographic spaces become an ordinary space, and each one appears in the table and in the Removed total.
Why does "Characters before" not match what I see?
The counts are characters as you see them, so an emoji such as 👩‍💻 counts as one. Invisible characters that stand on their own count too, which is why "Characters before" can be higher than what you see. A stray joiner glued to the letter before it is part of that character, so removing it may not change the count.

Written by the ToolsRift team · Last updated

Pages are drafted with AI assistance and checked by automated tests. How we write and check pages.

Was this tool useful?

Report a problem

Start typing to search every tool.

↑ ↓ to moveEnter to openEsc to close