</>
character.codes
← Back to Learn

Emoji and Unicode: How Emoji Actually Work

Published March 1, 2025

Emoji are Unicode characters

Every emoji is assigned a Unicode code point, just like letters and symbols. The grinning face 😀 is U+1F600, the red heart ❤️ is U+2764, and the rocket 🚀 is U+1F680.

The first emoji were standardized in Unicode 6.0 (2010), and new emoji are added with each Unicode release. As of Unicode 16.0, there are over 3,700 emoji defined.

ZWJ sequences

Some emoji are actually sequences of multiple code points joined by a Zero Width Joiner (U+200D, or ZWJ). The platform renders the combined sequence as a single glyph.

For example:

  • 👨‍👩‍👧‍👦 Family = 👨 + ZWJ + 👩 + ZWJ + 👧 + ZWJ + 👦 (7 code points, 1 visible emoji)
  • 👩‍💻 Woman Technologist = 👩 + ZWJ + 💻
  • 🏳️‍🌈 Rainbow Flag = 🏳️ + ZWJ + 🌈

If a platform doesn't support a ZWJ sequence, it falls back to displaying the individual emoji side by side.

Skin tone modifiers

Five skin tone modifiers (based on the Fitzpatrick scale) were added in Unicode 8.0. They are code points U+1F3FB through U+1F3FF. When placed after a human emoji, they change its appearance:

  • 👋 (U+1F44B) — waving hand, default yellow
  • 👋🏻 (U+1F44B U+1F3FB) — light skin tone
  • 👋🏽 (U+1F44B U+1F3FD) — medium skin tone
  • 👋🏿 (U+1F44B U+1F3FF) — dark skin tone

Text vs. emoji presentation

Some Unicode characters have both a text and an emoji presentation. A Variation Selector controls which is shown:

  • U+FE0E (VS15) — forces text presentation (e.g., ☀︎)
  • U+FE0F (VS16) — forces emoji presentation (e.g., ☀️)

This is why you sometimes see characters like ☀ rendered as a colorful emoji on some platforms and a plain text symbol on others — it depends on which variation selector (if any) is present and the platform's default behavior.

Cross-platform rendering

Unicode only defines which emoji exist and their code points. The actual visual design is created by each platform vendor:

  • Apple has its own emoji art
  • Google designs emoji for Android and Chrome
  • Microsoft, Samsung, Twitter/X, and others each have their own sets

This means the same code point can look quite different across devices. The underlying Unicode representation is always the same — only the visual rendering changes.