ZWJ (Zero Width Joiner) - what it is and how it works
This article takes about 4 minutes to read.
ZWJ is the invisible glue that turns separate emoji into compound characters like family groups and profession symbols.The Zero Width Joiner (U+200D) is a Unicode control character with no visible width. When placed between emoji, it tells the rendering engine to display them as a single combined glyph - if one exists.
Definition
Zero Width Joiner (ZWJ) is a non-printing character at Unicode codepoint U+200D. Originally designed for complex scripts like Arabic and Indic languages (where letter forms change based on adjacency), it was repurposed for emoji composition starting with Unicode 6.0.
In emoji context, ZWJ acts as a combinator: Emoji A + ZWJ + Emoji B = Combined Emoji (if supported). If the platform doesn't have a combined glyph, it gracefully degrades to showing A and B separately.
How ZWJ sequences work
A ZWJ sequence is a chain of emoji connected by ZWJ characters. The rendering engine processes the sequence left to right:
- Read the first emoji codepoint
- Encounter ZWJ (U+200D)
- Read the next emoji codepoint
- Check if a combined glyph exists for this pair
- If yes, render the combined glyph. If no, render both emoji separately
- Repeat for any additional ZWJ + emoji in the sequence
Common ZWJ sequence categories
Professions
Person + ZWJ + object = profession emoji:
- 👩 + ZWJ + 💻 = 👩💻 (woman technologist)
- 👨 + ZWJ + 🍳 = 👨🍳 (man cook)
- 🧑 + ZWJ + 🚀 = 🧑🚀 (astronaut)
Families
Multiple person emoji joined by ZWJ:
- 👨 + ZWJ + 👩 + ZWJ + 👧 = 👨👩👧 (family)
- 👩 + ZWJ + 👩 + ZWJ + 👦 + ZWJ + 👦 = 👩👩👦👦 (family with two mothers and two sons)
Gender variations
Base emoji + ZWJ + gender sign:
- 🧑🦰 = 🧑 + ZWJ + 🦰 (person with red hair)
- 🏃♀️ = 🏃 + ZWJ + ♀️ (woman running)
Flags (subdivision)
Subdivision flags like 🏴 (England) use tag sequences rather than ZWJ, but the principle is similar - multiple invisible characters combine into one glyph.
Why ZWJ sequences break
| Cause | Result | Fix |
|---|---|---|
| Old OS / font | Components shown separately | Update the device |
| Text editor strips ZWJ | Sequence breaks apart | Use a Unicode-aware editor |
| Platform doesn't support the combo | Fallback to individual emoji | Use well-established sequences |
| Character limit counts codepoints | Sequence uses more "characters" than expected | Count grapheme clusters instead |
Character counting implications
A family emoji like 👨👩👧👦 is 7 codepoints (4 emoji + 3 ZWJ characters). Platforms that count codepoints (like Twitter's legacy counter) may charge you 7 characters for what looks like 1. Modern platforms count "grapheme clusters" instead, treating the whole sequence as 1 unit.
Practical tips for emoji art
- Stick to widely-supported ZWJ sequences (professions, basic families)
- Test on multiple platforms before using in bios or important posts
- For maximum compatibility, prefer single-codepoint emoji over ZWJ sequences
- When copy-pasting ZWJ sequences, use the emoji picker rather than text selection to avoid breaking the sequence
Related terms
- Codepoint - the unique number assigned to each Unicode character