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.
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.
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 point | Name | Typical impact |
|---|---|---|
| U+200B | Zero width space | Invisible line-break point; breaks string comparison |
| U+200C | Zero width non-joiner | Blocks cursive joining in Arabic, Persian and Indic scripts |
| U+200D | Zero width joiner | Glues emoji sequences and some script forms together |
| U+2060–U+2064 | Word joiner and invisible operators | No visible glyph; used in fine typography and maths |
| U+FEFF | Byte order mark | Fine as the first byte of a file, junk anywhere else |
| U+200E / U+200F | Left-to-right and right-to-left marks | Direction hints that survive copy and paste |
| U+202A–U+202E | Bidi embedding and override | Can reorder how surrounding text displays |
| U+2066–U+2069 | Bidi isolates | The newer, safer version of the same controls |
| U+00AD | Soft hyphen | Visible only when the line wraps at that point |
| U+061C | Arabic letter mark | Zero-width direction control for Arabic text |
| U+FE00–U+FE0F | Variation selectors | Swap the glyph of the preceding character |
| U+E0000–U+E007F | Unicode tag characters | No glyph at all; documented in AI steganography |
| U+2000–U+200A | Invisible spaces (en quad to hair space) | Blank, but they occupy real width |
| U+3000 | Ideographic space | Full-width space, standard in CJK text |
| U+3164 / U+FFA0 | Hangul fillers | Render blank; used to fake empty usernames |
| U+2800 | Braille pattern blank | Looks 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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.
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.
Same engine, different problems: