SymbolMix / How emoji combine

How emoji combine: the invisible glue

Some emoji are secretly several emoji wearing a trench coat. Pick an example, switch the joiners off and on, and watch what your device does.

👩‍🚀with joiners
Skin tone:
  1. đź‘©U+1F469
  2. ZWJU+200D
  3. 🚀U+1F680

3 code points · 5 UTF-16 units (what JavaScript’s .length reports) · 11 bytes in UTF-8

What you just saw

Every emoji is one or more Unicode code points, numbers like U+1F469 (woman). When the builder puts an invisible zero-width joiner (U+200D) between two of them, your phone’s emoji font looks for a single drawing of that exact sequence. Woman, joiner, rocket has one: 👩‍🚀. Switch the joiners off and the font has nothing to merge, so you get the parts side by side.

Two other invisible helpers show up in the strip:

  • Skin-tone modifiers (U+1F3FB to U+1F3FF) follow a person emoji and repaint it in one of five tones based on the Fitzpatrick scale used by dermatologists.
  • Variation selector 16 (U+FE0F) tells the device “show this as a colourful emoji, not a plain text symbol”. It’s why ❤ and ❤️ can look different.

Why your friend sees something else

A ZWJ sequence is just text. If your friend’s phone has an older emoji font, it doesn’t know the combined drawing and shows the pieces instead, so a “heart on fire” arrives as ❤️🔥 in two parts. The Unicode Consortium publishes which sequences are recommended in its emoji ZWJ sequences chart; Apple, Google, Samsung and Microsoft then decide when to ship the artwork.

ZWJ sequences vs Emoji Kitchen vs SymbolMix

ZWJ sequences are official, few in number and text-based: they only exist once Unicode approves them and fonts include them. Emoji Kitchen is Google’s set of illustrated stickers for pairs its artists chose, sent as images. SymbolMix builds an image for any pair on the spot by recombining the shapes of open-source emoji, so nothing needs approving first. Try it in the emoji mixer.

Seeing a joiner snap two symbols into one picture is a small click of understanding. ahaboo builds narrated, hands-on lessons around clicks like that, such as why the Moon seems to change shape through the month.

A note for developers

Counting “characters” is harder than it looks. JavaScript’s .length counts UTF-16 units, so the family emoji above reports 11. To count what a person sees, use Intl.Segmenter with granularity: 'grapheme', which treats a whole ZWJ sequence as one.

Questions

What is a zero-width joiner?

The zero-width joiner (ZWJ, code point U+200D) is an invisible Unicode character. Placed between two emoji, it asks the font to draw them as one combined picture if the font has a design for that sequence. If not, the emoji simply show side by side.

Can I invent my own ZWJ emoji?

You can type any sequence, but it only renders as one picture if Unicode has recommended it and your phone’s emoji font includes it. Unofficial sequences fall back to separate emoji. For truly new combinations, use an image mashup like the SymbolMix mixer.

Is Emoji Kitchen built on ZWJ sequences?

No. Emoji Kitchen stickers are images drawn by Google’s illustrators and sent as pictures. ZWJ sequences are text: they travel as characters and each device draws them with its own emoji font.

Why does one emoji count as several characters?

Because it is several code points. A family emoji can be seven code points (four people and three joiners), which is 11 UTF-16 units. That’s why some apps count one emoji as two, five or even eleven characters against a length limit.