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- Also written as
ufe00-ufe0f- Category
- Joiners, selectors and fillers
- Removed by default
- When free-floating
- Governing option
- Aggressive
-a - Can be load-bearing
- Yes
Copy and paste U+FE0F
To copy and paste VARIATION SELECTOR-16 (U+FE0F), press the button: the character itself goes to your clipboard, and Ctrl+V (Cmd+V on a Mac) pastes it anywhere you can type.
This page covers a whole block, so the button copies one character from it: VARIATION SELECTOR-16 (U+FE0F).
Where it comes from
Every emoji that has both a text and an emoji presentation, where VARIATION SELECTOR-16 (U+FE0F) asks for the colour form and VARIATION SELECTOR-15 (U+FE0E) asks for the black-and-white one: ❤️, ☀️, ✔️. Also CJK typography, where VS1 to 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
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 ❤.
Working in a file rather than a paste? The document report for .docx, .odt and .html finds it inside the file, together with hidden runs and tracked changes, without you having to open it. If the question is what the rest of the writing does rather than what this one character does, measure sentence-length variation and see where each habit sits, with no score and no claim about who wrote the text.
Is it an AI watermark?
Used to hide data, but is 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
What is U+FE0F and why is it after my emoji?
U+FE0F is VARIATION SELECTOR-16: it tells the character in front of it to render as a colour emoji rather than as a black-and-white symbol, which is why hex dumps and error messages show fe0f right behind so many emoji. Directly after an emoji base the default pass keeps it, because taking it out would leave the monochrome text form; a selector with no emoji in front of it is removed, and `-a` removes it even where it is doing its job.
What is U+FE0E?
U+FE0E is VARIATION SELECTOR-15, the opposite request: it asks the character in front of it for the plain black-and-white text form instead of the colour emoji. Ghostchars handles it exactly like fe0f, keeping it directly after an emoji base and removing it anywhere else; `-a` removes it there too, and the character falls back to its default presentation.
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.
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 textClean it in Chrome as you pasteClean it on your Mac with one keystrokeAll characters