Skip to content
Ghostchars

Joiners, selectors and fillers

VARIATION SELECTORS (U+FE00–U+FE0F)

Sixteen invisible modifiers that pick which of several forms the preceding character should take. VS15 (U+FE0E) asks for the black-and-white text form; VS16 (U+FE0F) asks for the colour emoji form.

Range
U+FE00–U+FE0F
Removed by default
When free-floating
Governing option
Aggressive -a
Can be load-bearing
Yes

Where it comes from

Every emoji that has both a text and an emoji presentation — ❤️, ☀️, ✔️. Also CJK typography, where VS1–VS14 select a regional glyph variant. And from byte smuggling: the 256-codepoint variation selector supplement (U+E0100–U+E01EF) can encode an arbitrary byte string behind a single visible character.

Why it matters

A variation selector after an emoji is doing its job. A variation selector after a Latin letter is doing nothing you can see, and a run of selectors from the supplement block can carry a whole message — a technique published as "smuggling arbitrary data through an emoji". Because they attach to the preceding character, one visible glyph can hide kilobytes.

Before and after

BeforeAU+FE0FU+FE0F
AfterA ❤U+FE0F

The selector after "A" has no emoji to select and is removed. The one after the heart is what makes it red, and is kept.

The character is shown as a labelled chip so you can see where it sits. In your text it draws nothing at all.

When it is legitimate

Immediately after an emoji base (VS15/VS16) or after a CJK ideograph (the text selectors and the supplement). Ghostchars keeps them there and removes them anywhere else.

How to remove it

A selector that is not preceded by an emoji or CJK base is removed by the default pass. Ones that are, are kept and reported; `-a` removes them too, which will change ❤️ into a monochrome ❤.

Is it an AI watermark?

Used to hide data — not a watermark

No. VS16 after an emoji is how emoji are specified. A chain of supplement selectors after a letter is a deliberate payload. Neither is a watermark, and no model emits them as a signature.

A known carrier for deliberately hidden payloads. Someone put it there on purpose, which is a different question from who wrote the words.

Questions

Will cleaning turn my emoji black and white?

Not by default. A variation selector after an emoji base is kept. Only `-a` (aggressive) removes it, and the result is the monochrome text form.

What is the "invisible data behind an emoji" trick?

The 256 selectors in U+E0100–U+E01EF map one-to-one onto byte values. Append a chain of them to any character and you have hidden arbitrary bytes behind one visible glyph. Ghostchars removes any selector that has no CJK or emoji base to attach to.

Do they matter in Chinese or Japanese text?

Yes — after a CJK ideograph a selector picks a regional glyph variant, so it is kept in that position.

Check your own text

Paste anything into the cleaner to see every hidden character it contains, with position, codepoint and what happens to each one. Nothing is uploaded.

Check your own textAll characters