Emoji vs text symbols: how Unicode styles glyphs

Understanding emoji vs text symbols explains why the exact same character can look like a colorful cartoon picture on your smartphone but a simple black outline on a computer monitor. Here is how Unicode distinguishes text dingbats from graphic emoji using variation selectors.

By Sudarshan BabarUpdated 3 min read

The dual nature of modern Unicode glyphs

When you type a character like a heart (♥), a star (★), a smiley (☺), or an airplane (✈), how does your computer decide whether to draw a simple black-and-white typographical outline or a glossy, full-color graphic emoji? This distinction between emoji vs text symbols is governed by precise rules in the Unicode Standard.

Originally, Unicode characters were strictly monochrome text glyphs designed to match the surrounding font family's weight, stroke width, and color. However, when Unicode integrated Japanese mobile carrier emojis in 2010 (Unicode 6.0), dozens of existing text symbols were reassigned a dual personality: they can render either as typographic text or as colorful emoji images.

Variation Selectors: VS15 vs VS16

To give authors and operating systems precise control over appearance, Unicode introduced two invisible control characters called Variation Selectors:

SelectorCode PointPurposeExample
Variation Selector-15 (VS15)U+FE0EForces text presentation (monochrome outline matching font)✈︎ renders as ✈︎
Variation Selector-16 (VS16)U+FE0FForces emoji presentation (colorful bitmap or vector image)✈️ renders as ✈️

When a variation selector is placed immediately after a base character, it changes how the rendering engine treats the glyph. For example, U+2764 by itself is a simple heart dingbat (❤). When followed by U+FE0F, it transforms into the vivid red heart emoji (❤️). The variation selector itself has no width and produces no visible ink; it acts solely as a styling directive for font layout engines.

Common characters with text and emoji forms

Many everyday symbols exist in both forms. Notice how the text version blends naturally with paragraph typography, while the emoji version demands attention:

  • Smiley face: ☺ (U+263A text) vs ☺️ (U+263A + U+FE0F emoji). See the smiley face symbol page.
  • Snowflake: ❄ (U+2744 text) vs ❄️ (U+2744 + U+FE0F emoji).
  • Copyright: © (U+00A9 text) vs ©️ (U+00A9 + U+FE0F blue square emoji on some platforms).
  • Warning sign: ⚠ (U+26A0 text) vs ⚠️ (U+26A0 + U+FE0F yellow triangle emoji).
  • Sun: ☀ (U+2600 text) vs ☀️ (U+2600 + U+FE0F emoji).

Color font formats: COLR/CPAL, SBIX, and SVG

Unlike traditional monochrome fonts that store simple vector outlines, emoji fonts require advanced color font formats to embed gradients and shading:

  • COLR/CPAL: Developed by Microsoft and standardized in OpenType, this format stacks layered vector outlines with indexed color palettes. It is lightweight, scales crisply to any resolution, and powers Segoe UI Emoji on Windows.
  • SBIX (Standard Bitmap Graphics Table): Used by Apple in Apple Color Emoji. It embeds full-color PNG images at multiple resolutions (e.g. 32px, 64px, 160px).
  • CBDT/CBLC: Google’s color bitmap format, used for Noto Color Emoji on Android and ChromeOS.
  • SVG in OpenType: Embeds scalable SVG vector artwork directly inside the font file, supported in Adobe Creative Cloud and Firefox.

Understanding these formats explains why missing font support can cause symbols showing as boxes on older software.

Accessibility and screen reader behavior

The difference between emoji and text symbols has major implications for screen readers used by blind and low-vision users:

  • Text symbols: Screen readers often read text symbols according to their typographical function or skip purely decorative characters. For example, • is read simply as “bullet”.
  • Emoji symbols: When an emoji sequence is encountered, screen readers announce its full Unicode emoji description. For example, inserting 👏 is vocalized as “clapping hands sign”. If you string multiple emojis together as decorative dividers, a screen reader will recite every single item aloud, creating a tedious listening experience for visually impaired users.

Copy-paste quirks and character length

Because emoji often consist of multiple code points joined together, they behave differently than text characters in code and character-limited fields:

In JavaScript, standard strings measure length in 16-bit code units (UTF-16). A basic text symbol like ★ has a length of 1. But an emoji with a variation selector like ✈️ has a length of 2 (base character + VS16). More complex emoji, like a female scientist with a dark skin tone (👩🏿‍🔬), consist of four distinct code points glued together with zero-width joiners, registering as a length of 7 in JavaScript! Learn how encoding affects storage in our guide on what is Unicode.

Controlling emoji presentation with CSS

Modern web standards give developers fine-grained CSS control over glyph presentation without modifying HTML code points. The CSS Fonts Module Level 4 introduces the font-variant-emoji property:

.prose-symbols { font-variant-emoji: text; }

Setting font-variant-emoji: text forces all characters within that element to render in monochrome font outlines, preserving a uniform, bookish aesthetic across articles. Conversely, setting font-variant-emoji: emoji forces colorful emoji rendering wherever possible. Explore our comprehensive emoji symbols collection and heart symbols collection for copy-ready characters.

Frequently asked questions

What is the difference between a text symbol and an emoji?

A text symbol is a monochromatic typographic glyph styled by your document font. An emoji is a full-color graphical image rendered by a dedicated color font.

What does U+FE0F do?

U+FE0F is Variation Selector-16. It instructs the computer or phone to display the preceding character as a colorful emoji rather than a black-and-white text symbol.

Why do some emojis look black and white on my computer?

If the software or font does not support color emoji rendering (or if the character lacks an explicit U+FE0F variation selector), it falls back to the default monochrome font glyph.

Can I force an emoji to display as plain black text?

Yes. In HTML you can append the entity ︎ (Variation Selector-15) directly after the symbol, or apply the CSS property font-variant-emoji: text.

Sources

  1. Unicode Technical Report #51: Unicode Emoji
  2. W3C CSS Fonts Module Level 4: font-variant-emoji
  3. Unicode Consortium: Standard Variation Sequences