Variation selectors, U+FE00 to U+FE0F
Invisible characters that choose between two renderings of the character before them. The best-known is U+FE0F, which asks for the emoji presentation: it is the difference between a plain check mark glyph and the colourful emoji one.
How it works
A variation selector modifies the character before it, selecting between alternate renderings that Unicode defines for that character. The two that matter in practice are U+FE0E, which requests the text presentation, and U+FE0F, which requests the emoji presentation. A check mark or a heart has both a monochrome glyph and a colour emoji glyph, and the selector decides which the renderer draws. The selector itself has no width and no glyph, so it satisfies every definition of an invisible character, and removing it is nonetheless a visible change to your text: the emoji becomes a small black symbol. That is why this is the one invisible character we deliberately do not touch. Our rule is that removing something invisible must not change what you see, and this one fails that test. The joiner logic treats it as transparent when looking at neighbours, so a variation selector between an emoji and a joiner does not stop the joiner being recognised as meaningful.
What it is legitimately for
Constantly, in emoji. Without U+FE0F many symbols render as monochrome text glyphs rather than the emoji people expect.
What it breaks
- Removed, an emoji silently changes appearance, which is a visible change to your text.
- Left in, it is one more invisible character in the string, so comparison and search can still be affected.
How to find it yourself
Look for the ef b8 8x range in a hex dump, immediately after the character it modifies.
What Clipboard Sanitizer does
Left alone, deliberately. It is invisible, but it is not noise: stripping it changes how your text looks. The app treats it as transparent when deciding about neighbouring joiners, and never removes it.
Questions
Why not remove it like the others?
Because our rule is that removing an invisible character must not change how your text reads. This one fails that test, so it stays. We would rather be predictable than thorough.