Invisible Character Remover

Free · 100% LocalOne scan reveals every invisible character in your text — zero-width spaces, direction marks, tag characters and more — and one click removes the ones you do not want. Everything happens in your browser.

🔒 Zero upload · works offline
⚡ Full code-point report
🧾 Name, range and count per type

1 Original Text · Paste Anything

Total 0 Hidden 0 Types 0

2 Detection Preview · Red Marks = Hidden Characters

Paste text above and every hidden character will "reveal" itself here as a red tag.

3 Cleaned Result · Exactly What You See

Your cleaned text will appear here.
Output 0 Removed 0

Cleaning Options

Dash handling:
Dash range: — U+2014, ⸺ U+2E3A, ⸻ U+2E3B, ― U+2015. These appear frequently in AI text — whether to process them is up to you.

What Counts as an Invisible Character?

An invisible character is any code point that renders as nothing: no glyph, no width, or a blank space indistinguishable from an ordinary gap. Unicode holds more of them than most people expect — the catalogue below lists the ones that turn up in pasted text.

They are not a defect: almost every entry has a legitimate purpose — direction control for mixed-language text, joiners for emoji and cursive scripts, a byte order mark for file encodings. They become a problem only in code, JSON, identifiers or a database column.

The Invisible Character List

Every row below is something this tool can report; the impact column is what you notice when it ends up somewhere it does not belong.

Code pointNameTypical impact
U+200BZero width spaceInvisible line-break point; breaks string comparison
U+200CZero width non-joinerBlocks cursive joining in Arabic, Persian and Indic scripts
U+200DZero width joinerGlues emoji sequences and some script forms together
U+2060–U+2064Word joiner and invisible operatorsNo visible glyph; used in fine typography and maths
U+FEFFByte order markFine as the first byte of a file, junk anywhere else
U+200E / U+200FLeft-to-right and right-to-left marksDirection hints that survive copy and paste
U+202A–U+202EBidi embedding and overrideCan reorder how surrounding text displays
U+2066–U+2069Bidi isolatesThe newer, safer version of the same controls
U+00ADSoft hyphenVisible only when the line wraps at that point
U+061CArabic letter markZero-width direction control for Arabic text
U+FE00–U+FE0FVariation selectorsSwap the glyph of the preceding character
U+E0000–U+E007FUnicode tag charactersNo glyph at all; documented in AI steganography
U+2000–U+200AInvisible spaces (en quad to hair space)Blank, but they occupy real width
U+3000Ideographic spaceFull-width space, standard in CJK text
U+3164 / U+FFA0Hangul fillersRender blank; used to fake empty usernames
U+2800Braille pattern blankLooks exactly like a space, but is not one

If you came here chasing one specific culprit, the zero width space remover page goes deeper on U+200B — the character behind most "identical but not equal" bugs.

How to Find Them Without a Tool

In an Editor

Editors can search for invisible characters even though they cannot draw them. In VS Code, enable the regular-expression toggle in Find and search for [\u200B\u200C\u200D\uFEFF]; the matches show exactly where they sit. In Word, the Find box understands ^u plus the decimal code point, so ^u8203 (8203 = 0x200B) finds zero width spaces in a document.

On the Command Line

A single grep finds them in a file: grep -P '\x{200B}' file.txt on systems with PCRE support. Python needs one line — read the file as UTF-8 and call s.count('\u200b'). These checks find the characters; removing them is what the tool above is for.

Delete or Keep? A Quick Rule

Delete without hesitation: zero width spaces in code and data, byte order marks anywhere except the start of a file, Unicode tag characters, Hangul fillers and Braille blanks in ordinary text.

Handle with care: joiners and non-joiners in emoji or Arabic, Persian and Indic text; variation selectors controlling emoji presentation; the ideographic space where CJK typography expects it; soft hyphens in typeset documents.

The tie-breaker: for machine-readable text, blank-rendering characters are almost never intentional; for human eyes with emoji or non-Latin scripts, look before you delete.

How to Remove Invisible Characters (3 Steps)

  1. Paste the text. The counters update live: total, hidden and type counts.
  2. Review the report. Each type is listed with its code point range and count; the preview marks every occurrence in red.
  3. Copy the cleaned text. Confirm nothing you needed was removed, then paste the result wherever it belongs.

Everything runs locally, so the page works with the network switched off. For the general workflow behind these tools, see the ChatGPT watermark remover home page.

Frequently Asked Questions

What is an invisible character remover?

An invisible character remover is a tool that finds code points which render as nothing — zero width spaces, direction marks, tag characters and their relatives — and deletes the ones you select. This one scans in your browser, lists every hidden code point it finds with a count, and returns a cleaned copy. No upload, no sign-up, no limits. It is the generalist counterpart to the narrower zero width space remover.

Which characters does it detect?

The full list on this page: zero width space (U+200B), joiners (U+200C, U+200D), word joiners and invisible operators, the byte order mark (U+FEFF), direction marks and bidi controls, soft hyphens, variation selectors, Unicode tag characters, invisible space variants, Hangul fillers, the Braille blank and the ideographic space. Every hit is listed by name and code point in the detection report, not merely counted.

Does my text leave my browser?

No. Both the detection pass and the cleanup run as local JavaScript. Your text is never transmitted, logged or stored, and the page keeps working after you disconnect. That is the practical reason the tool is safe for keys, contracts, customer records or anything else you would not paste into a random web form. There is nothing to install and nothing to sign up for.

Why can two identical-looking strings behave differently?

Because they are not actually identical. A U+200B that renders as nothing still exists in the byte stream, so a hash, a comparison or a unique index treats the two values as different. Lookup functions fail, join keys mismatch, and duplicate records slip past validation — all while the screen shows two names that appear to be the same. Removing the invisible characters makes the data behave the way it looks.

Can I delete some types and keep others?

Partially. The cleaning options group characters into hidden controls, invisible space variants and the ideographic space, each with its own toggle, and dash handling is separate. The zero-width family — U+200B, U+200C and U+200D — shares a single toggle, so text that relies on emoji joiners deserves a glance at the preview before you clean it, especially around joined emoji.

Will cleaning break my emoji or my non-Latin text?

It can, if you remove joiners and direction controls that were doing real work. Family and profession emoji are sequences glued by U+200D; Arabic, Persian and Indic scripts use U+200C to block cursive joining. The preview highlights every candidate before you commit, so joined emoji and cursive text are visible cases rather than surprises. Compare the preview before and after copying.

How do I check a file without this tool?

Search with a regular expression: [\u200B\u200C\u200D\uFEFF] in VS Code, \x{200B} in Notepad++, ^u8203 in Word, or grep -P '\x{200B}' on the command line. Python can count occurrences with s.count('\u200b'). These checks find the characters but do not remove them — paste the text here once you know what you are dealing with, and the tool does the deletion in one pass.

More Tools on This Site

Same engine, different problems: