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

CodepointNameLegitimate useCleaner action
U+200BZero Width SpaceMarks a line-break opportunity without a visible gapRemoved
U+200CZero Width Non-JoinerPrevents ligature formation in Arabic, Persian, DevanagariRemoved
U+200DZero Width JoinerJoins glyphs; builds compound emoji sequencesRemoved
U+2060Word JoinerPrevents a line break without adding widthRemoved
U+FEFFZero Width No-Break Space / BOMByte-order mark at the start of a fileRemoved
U+00ADSoft HyphenOptional hyphenation point, shown only if the word wrapsRemoved
U+180EMongolian Vowel SeparatorMongolian script formattingRemoved
U+200E / U+200FLeft-to-Right / Right-to-Left MarkSets direction for neutral characters in mixed textRemoved
U+202A–U+202EBidi embedding & override controlsForces text direction in bidirectional layoutsRemoved
U+2066–U+2069Bidi isolate controlsIsolates a run of directional textRemoved
U+FE00–U+FE0FVariation Selectors 1–16Selects a glyph variant, e.g. emoji vs text presentationRemoved
U+E0000–U+E007FUnicode Tag charactersDeprecated language tagging; mirrors printable ASCIIRemoved
U+00A0No-Break SpaceA space that will not break across linesNormalized to U+0020
U+2007Figure SpaceSpace as wide as a digit, for aligning numbersNormalized to U+0020
U+2009Thin SpaceNarrow typographic spaceNormalized to U+0020
U+200AHair SpaceThe narrowest typographic spaceNormalized to U+0020
U+202FNarrow No-Break SpaceNarrow space that will not break, used before punctuation in FrenchNormalized to U+0020
U+205FMedium Mathematical SpaceSpacing in mathematical notationNormalized to U+0020
U+3000Ideographic SpaceFull-width space in CJK typographyNormalized 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