Variation selectors: the second invisible carrier
U+FE00-FE0F and the supplement block ride invisibly on ordinary letters. A quieter hiding place than zero-width characters.
Hidden characters · 1 min read
Variation selectors are Unicode's mechanism for saying "render the preceding character this particular way". U+FE0F is the best known — it is the selector that turns a monochrome symbol into a colour emoji.
There are 16 in the basic block (U+FE00-FE0F) and 240 more in the supplement (U+E0100-U+E01EF). That is 256 invisible modifiers.
Why they make a good hiding place
Attach a variation selector to a character that has no defined variant form — an ordinary letter like a — and nothing happens visually. The selector is simply ignored for rendering. But it is still there in the data.
With 256 available selectors you get a full byte of hidden information per visible character. A 200-word paragraph can carry a payload of a couple of hundred bytes with no visible change whatsoever.
They are also quieter than zero-width characters in a specific way: a sanitiser that strips U+200B and U+FEFF frequently leaves U+FE0E and U+FE0F alone, precisely because they are needed for emoji. The legitimate use protects the illegitimate one.
The emoji complication
This is the reason careless cleanup causes damage. U+FE0F is load-bearing in emoji presentation. Strip every variation selector unconditionally and some emoji will change appearance or degrade to their text form.
So the honest position on this category is: removal is safe in prose, and needs care around emoji. A tool should tell you which it found rather than silently deciding for you.
Detection
Same requirement as tag characters: iterate by codepoint. The supplement block sits above U+FFFF, so index-based iteration miscounts it.
Detection itself is trivial once you iterate correctly — it is a set membership check. There is no guessing involved, which is why a character-level scan gives you exact counts rather than a probability.
Run a scan and any variation selectors show as a VS chip at the exact position they occupy.
Related: zero-width characters · Unicode tag characters