Letras Diferentes
Unicode research · Emoji specification

Emoji Variation Selectors VS15 and VS16: Standardized Sequences and Data Integrity

A technical reference to U+FE0E and U+FE0F, emoji versus text variation sequences, Unicode data, unsupported selectors and safe copy/paste.

Technical referenceUnicode UTS #51 & segmentation

Variation selectors are Unicode characters whose function is to request a standardized variant presentation of another character in a defined sequence. VS15 (U+FE0E) and VS16 (U+FE0F) are widely used for text and emoji presentation, but appending VS16 to any arbitrary character is not a guarantee of an emoji drawing.

A variation selector modifies a preceding base

U+FE0E VARIATION SELECTOR-15 requests text-style presentation and U+FE0F VARIATION SELECTOR-16 requests emoji-style presentation in applicable standardized emoji variation sequences. They follow a base character. The selector is not a visible pictograph that stands alone.

An isolated VS16 in a source string is still a Unicode scalar, but it cannot by itself create an emoji. In diagnosis, list exact scalars and their order, including selectors, rather than comparing only screenshots.

Standardized variation sequences constrain valid requests

Unicode publishes standardized variation sequences and emoji-related data. Supported base-plus-selector pairs are not defined for every code point. A product should consult the sequence data rather than assuming all characters have both variants.

Some characters have a default text presentation while others have a default emoji presentation; a defined variation sequence can request the alternative. Different Unicode versions may add recognized sequences. Test with the data version actually deployed.

VS15 and VS16 are not separate encodings

UTF-8 can encode U+FE0E and U+FE0F as ordinary scalar values. The pair U+2764 U+FE0F is a two-scalar string, not an image or a special UTF-16 surrogate encoding. JavaScript length for that pair is 2 UTF-16 code units because each scalar lies in the BMP.

This contrasts with a supplementary-plane emoji such as U+1F600, which is one scalar but two UTF-16 code units. The concept of variation sequence must not be confused with surrogate pairs or multi-code-point emoji ZWJ sequences.

A selector does not force universal platform glyphs

When a font or renderer lacks a desired presentation, it can fall back to another glyph or ignore a presentation preference. A text selector on one system may still resemble a colored symbol on another, depending on font availability.

Therefore, distinguish two questions: did the source text preserve VS15 or VS16, and did the platform honor its requested presentation? Only the first is a data-integrity property. Neither can be established reliably by counting apparent glyphs.

Copy and paste can preserve or transform selectors

A plain-text clipboard representation can carry both the base scalar and variation selector. Some applications may normalize their own content or replace rich emoji with images and later reconstruct text, creating a risk of dropped or added selectors.

A regression harness should compare before/after code points for both U+2764 and U+2764 U+FE0F. A visually matching heart does not prove exact round-trip fidelity. Save the original payload if preserving variation selectors is a product requirement.

Normalization is not emoji presentation conversion

Unicode NFC/NFD do not serve as an API to force emoji or text-style glyphs. Applying normalize('NFC') to a heart and VS16 does not generally remove VS16; changing font or presentation state is a separate operation.

Do not use NFKC as a universal emoji cleaner or as a test for visual equivalence. Compatibility normalization has unrelated effects on styled mathematical letters and other characters; it is not a substitute for consulting emoji sequence data.

Grapheme clusters keep selectors with their base

Under default grapheme segmentation, a variation selector belongs with its associated preceding character in most intended uses. A caret that stops between the base and selector or a deletion that removes only the base can produce confusing residual invisible data.

Editing logic can use UAX #29 grapheme boundaries as defaults and offer separate scalar inspection for advanced diagnostics. Document how Backspace treats a fully qualified emoji sequence so user expectations are clear.

VS16 in ZWJ sequences can carry qualification

Emoji ZWJ sequences may include VS16 on components where qualification requires it. Omitting such a selector may produce an unqualified or minimally qualified sequence; the relevant Unicode emoji data and current RGI list define expected forms.

Do not assume removing every VS16 preserves RGI status or identical rendering. Check the exact sequence against the versioned emoji test data before claiming two visually similar strings are interchangeable.

Handle unknown sequences conservatively

For importers, validation and search systems, preserve unknown variation selectors unless a documented field policy explicitly transforms them. Unknown sequences might be ignored in display today yet gain defined behavior in later Unicode versions.

A useful inspector can flag a sequence as unsupported by a particular product version without silently discarding characters. Security and identifier restrictions are separate from the Unicode validity of a scalar.

Unicode inspector: reproducible scalar and cluster evidence

The following self-contained JavaScript exercise records source scalars and counts instead of inferring text identity from an emoji drawing. It is useful for audits, but it does not query the platform's actual emoji font repertoire or prove the RGI status of an arbitrary sequence; those require versioned emoji data.

const variants = ['\u2764','\u2764\uFE0E','\u2764\uFE0F'];
for(const s of variants){
 console.log([...s].map(c=>'U+'+c.codePointAt(0).toString(16).toUpperCase()));
 console.log(s.length, s.normalize('NFC')===s);
}
// Use Unicode emoji variation sequence data to test whether a pair is defined.

When diagnosing a difference, preserve the original clipboard value, print each code point explicitly, and compare the string after any normalization, import or save operation. Visual fallback is a separate variable, and a mismatching screenshot does not alone establish lost data.

Unicode and rendering distinction matrix

CaseExact representationImplication
VS15U+FE0Etext presentation request in applicable sequences
VS16U+FE0Femoji presentation request in applicable sequences
Heart text formU+2764 U+FE0Etwo scalars
Heart emoji formU+2764 U+FE0Ftwo scalars
Unrecognized pairarbitrary base + VS16not guaranteed a standardized emoji variant

Data validity, qualification and display support must be assessed separately. Even when a sequence conforms to Unicode scalar constraints, it may not be recommended for general interchange or supported by a particular glyph engine.

Regression test design for emoji interoperability

  1. VS15: record the exact input U+FE0E, scalar sequence, UTF-16 unit count and grapheme boundaries. The target observation is text presentation request in applicable sequences. Compare data integrity independently from glyph appearance, and document the platform's emoji version.
  2. VS16: record the exact input U+FE0F, scalar sequence, UTF-16 unit count and grapheme boundaries. The target observation is emoji presentation request in applicable sequences. Compare data integrity independently from glyph appearance, and document the platform's emoji version.
  3. Heart text form: record the exact input U+2764 U+FE0E, scalar sequence, UTF-16 unit count and grapheme boundaries. The target observation is two scalars. Compare data integrity independently from glyph appearance, and document the platform's emoji version.
  4. Heart emoji form: record the exact input U+2764 U+FE0F, scalar sequence, UTF-16 unit count and grapheme boundaries. The target observation is two scalars. Compare data integrity independently from glyph appearance, and document the platform's emoji version.
  5. Unrecognized pair: record the exact input arbitrary base + VS16, scalar sequence, UTF-16 unit count and grapheme boundaries. The target observation is not guaranteed a standardized emoji variant. Compare data integrity independently from glyph appearance, and document the platform's emoji version.

In addition to positive fixtures, test invalid assumptions: unsupported combinations, missing selectors, an unexpected joiner and a truncated surrogate. Distinguish not in the supported emoji repertoire from malformed Unicode encoding. Save environment details and Unicode/emoji data version alongside every report.

What tests cannot infer from screenshots

Two systems may use identical scalars but distinct vendor artwork, fallback fonts, color-glyph mechanisms and accessibility names. A test that asserts pixel equality across such systems is not a test of Unicode text integrity. For exact portability, assert scalar arrays and intended sequence membership first, then evaluate rendering and assistive technology as separate quality dimensions.

Authoritative specifications and versioned data

The sources below distinguish Unicode scalar properties, standardized variation sequences, RGI emoji repertoire, grapheme segmentation and vendor implementation choices. A property defined by one release may not yet be deployed on the target operating system.

  • Unicode Emoji Technical Standard UTS #51 — authoritative Unicode or implementation reference. Check data-version compatibility and the difference between normative character properties, RGI repertoire and platform rendering support.
  • Unicode Emoji Variation Sequences — authoritative Unicode or implementation reference. Check data-version compatibility and the difference between normative character properties, RGI repertoire and platform rendering support.
  • Unicode Standardized Variants — authoritative Unicode or implementation reference. Check data-version compatibility and the difference between normative character properties, RGI repertoire and platform rendering support.
  • Unicode Text Segmentation UAX #29 — authoritative Unicode or implementation reference. Check data-version compatibility and the difference between normative character properties, RGI repertoire and platform rendering support.
  • Unicode Normalization UAX #15 — authoritative Unicode or implementation reference. Check data-version compatibility and the difference between normative character properties, RGI repertoire and platform rendering support.

Continue within the Emoji & Symbol Sequences virtual silo, or inspect adjacent rendering, text editing and interchange topics already published in this library.