Invisible Unicode Characters
The complete set of non-rendering and lookalike codepoints our cleaner detects: what each one is legitimately for, and what happens to it when you clean.
Which Unicode characters are invisible?
The main invisible codepoints used to watermark or fingerprint text are zero-width spaces and joiners (U+200B—U+200D), the word joiner (U+2060), byte order mark (U+FEFF), bidirectional controls (U+202A—U+202E), variation selectors, and Unicode tag characters (U+E0000—U+E007F).
- Tag characters can encode an entire hidden message inside ordinary text.
- Homoglyph spaces look like a normal space but are distinct codepoints.
- All of these survive copy, paste and email intact.
- All of them can be removed deterministically.
The reference table
| Codepoint | Name | Legitimate use | Cleaner action |
|---|---|---|---|
U+200B | Zero Width Space | Marks a line-break opportunity without a visible gap | Removed |
U+200C | Zero Width Non-Joiner | Prevents ligature formation in Arabic, Persian, Devanagari | Removed |
U+200D | Zero Width Joiner | Joins glyphs; builds compound emoji sequences | Removed |
U+2060 | Word Joiner | Prevents a line break without adding width | Removed |
U+FEFF | Zero Width No-Break Space / BOM | Byte-order mark at the start of a file | Removed |
U+00AD | Soft Hyphen | Optional hyphenation point, shown only if the word wraps | Removed |
U+180E | Mongolian Vowel Separator | Mongolian script formatting | Removed |
U+200E / U+200F | Left-to-Right / Right-to-Left Mark | Sets direction for neutral characters in mixed text | Removed |
U+202A–U+202E | Bidi embedding & override controls | Forces text direction in bidirectional layouts | Removed |
U+2066–U+2069 | Bidi isolate controls | Isolates a run of directional text | Removed |
U+FE00–U+FE0F | Variation Selectors 1–16 | Selects a glyph variant, e.g. emoji vs text presentation | Removed |
U+E0000–U+E007F | Unicode Tag characters | Deprecated language tagging; mirrors printable ASCII | Removed |
U+00A0 | No-Break Space | A space that will not break across lines | Normalized to U+0020 |
U+2007 | Figure Space | Space as wide as a digit, for aligning numbers | Normalized to U+0020 |
U+2009 | Thin Space | Narrow typographic space | Normalized to U+0020 |
U+200A | Hair Space | The narrowest typographic space | Normalized to U+0020 |
U+202F | Narrow No-Break Space | Narrow space that will not break, used before punctuation in French | Normalized to U+0020 |
U+205F | Medium Mathematical Space | Spacing in mathematical notation | Normalized to U+0020 |
U+3000 | Ideographic Space | Full-width space in CJK typography | Normalized to U+0020 |
Why these particular characters
Every entry above shares one property: you cannot see it. That is what makes them useful as carriers and what makes them dangerous as accidents. A character you cannot see is a character you cannot proofread out, and it will follow the text through every copy, every paste and every export until something explicitly removes it.
Zero-width characters
The core group. They occupy no horizontal space and have no glyph. Their legitimate jobs are structural, controlling where lines may break and how adjacent glyphs join, which means that in plain Latin prose they are almost always unintentional.
Bidirectional controls
These exist for mixing right-to-left scripts with left-to-right ones. Outside that context they are the basis of the “Trojan Source” class of attacks, where source code renders in one order and compiles in another. In an English-language document they have no business being there.
Variation selectors and tag characters
Variation selectors pick between glyph forms, most commonly emoji versus monochrome text presentation. Tag characters are a deprecated language-tagging mechanism whose one-to-one mapping onto printable ASCII makes them an unusually convenient hiding place for a readable payload.
Space homoglyphs
These are visible, just indistinguishable. A non-breaking space looks exactly like a regular space and behaves differently in every string comparison, regex and search index you will ever run. Normalizing them to U+0020 is usually the right call outside typographic work.
Practical consequences
- Search fails. A zero-width space inside a term means an exact-match search will never find it.
- Diffs go noisy. Version control reports a change on lines that look identical.
- Validation rejects input. APIs and forms that filter control characters return errors with no visible cause.
- Code breaks mysteriously. A pasted snippet with a hidden character produces a syntax error pointing at a line that looks perfectly fine.
- Deduplication misses. Two identical-looking strings hash differently.
Removing them
Paste your text into the cleaner and press Clean. Everything in the table above is handled in a single pass, with a report showing which codepoints were present and how many of each. The step-by-step guide covers verification and editor-specific checks.
Frequently asked questions
What are invisible Unicode characters?
They are valid Unicode codepoints that render no visible glyph, or render identically to another character. Zero-width spaces, joiners, bidirectional controls, variation selectors and tag characters all take up no width on screen but are fully present in the underlying bytes.
Are invisible Unicode characters harmful?
They are not malicious in themselves. Most exist for legitimate typographic reasons. They become a problem when they end up somewhere they were not intended: breaking exact-match search, corrupting diffs, failing input validation, causing string comparisons to fail, or carrying an encoded payload you did not know about.
How do invisible characters encode hidden data?
Any two distinct invisible characters form a binary alphabet: one represents 0, the other 1. A sequence of them between words spells out arbitrary bits. The Unicode tag block goes further by mirroring printable ASCII, so a readable string can be embedded directly and recovered with an offset subtraction.
How do I find invisible characters in a file?
Paste the text into our inspector for a full codepoint report, or use an editor feature: VS Code's editor.unicodeHighlight.invisibleCharacters setting boxes them in place, and a regex search over the ranges in the table above will locate them in most editors.
Does removing them change how the text looks?
No. Zero-width and control characters render nothing, so deleting them changes nothing visually. Space homoglyphs are replaced by a normal space, which is a marginal width difference in justified typography and identical in most contexts.
Should I ever keep these characters?
Sometimes, yes. Emoji sequences depend on zero-width joiners, Arabic and Devanagari text depends on non-joiners, and genuinely bidirectional documents need the direction marks. If you are cleaning multilingual content or emoji-heavy text, inspect first and check what the report found before you strip everything.
Scan your text against this table
The inspector checks every codepoint above in one pass and reports exactly what it finds.
Run the inspector