Skip to main content
I
Uni
UNICODE
Tools/Ligatures & ZWJ Studio

OpenType Ligatures & ZWJ / ZWNJ Studio

Inspect OpenType glyph substitutions (GSUB/GPOS), Zero-Width Joiners (ZWJ U+200D), and Zero-Width Non-Joiners (ZWNJ U+200C) in Arabic, Urdu, Devanagari, and Emoji sequences.

60Total Codepoints
5Zero-Width Joiners (ZWJ)
0Zero-Width Non-Joiners (ZWNJ)
49Rendered Clusters
Insert Invisible Controls:
Quick Complex Script Presets:
Complex Script Input Stream
Font Size (18px):

Rendered Grapheme Clusters & Codepoint Decomposition (49 Clusters)

OpenType GSUB/GPOS Shaper
👨‍👩‍👧‍👦Emoji Compound
👨U+1F468EMOJI GLYPH
[ZWJ]U+200DZERO WIDTH JOINER (ZWJ)
👩U+1F469EMOJI GLYPH
[ZWJ]U+200DZERO WIDTH JOINER (ZWJ)
👧U+1F467EMOJI GLYPH
[ZWJ]U+200DZERO WIDTH JOINER (ZWJ)
👦U+1F466EMOJI GLYPH
Plain
U+0020CHARACTER U+20
👩‍🚀Emoji Compound
👩U+1F469EMOJI GLYPH
[ZWJ]U+200DZERO WIDTH JOINER (ZWJ)
🚀U+1F680EMOJI GLYPH
Plain
U+0020CHARACTER U+20
🏳️‍🌈Emoji Compound
🏳U+1F3F3EMOJI GLYPH
U+FE0FCHARACTER U+FE0F
[ZWJ]U+200DZERO WIDTH JOINER (ZWJ)
🌈U+1F308EMOJI GLYPH
Plain
U+0020CHARACTER U+20
|Plain
|U+007CCHARACTER U+7C
Plain
U+0020CHARACTER U+20
oPlain
oU+006FCHARACTER U+6F
fPlain
fU+0066CHARACTER U+66
fPlain
fU+0066CHARACTER U+66
iPlain
iU+0069CHARACTER U+69
cPlain
cU+0063CHARACTER U+63
iPlain
iU+0069CHARACTER U+69
aPlain
aU+0061CHARACTER U+61
lPlain
lU+006CCHARACTER U+6C
,Plain
,U+002CCHARACTER U+2C
Plain
U+0020CHARACTER U+20
oPlain
oU+006FCHARACTER U+6F
fPlain
fU+0066CHARACTER U+66
fPlain
fU+0066CHARACTER U+66
lPlain
lU+006CCHARACTER U+6C
iPlain
iU+0069CHARACTER U+69
nPlain
nU+006ECHARACTER U+6E
ePlain
eU+0065CHARACTER U+65
Plain
U+0020CHARACTER U+20
(Plain
(U+0028CHARACTER U+28
fPlain
fU+0066CHARACTER U+66
iPlain
iU+0069CHARACTER U+69
,Plain
,U+002CCHARACTER U+2C
Plain
U+0020CHARACTER U+20
fPlain
fU+0066CHARACTER U+66
lPlain
lU+006CCHARACTER U+6C
,Plain
,U+002CCHARACTER U+2C
Plain
U+0020CHARACTER U+20
fPlain
fU+0066CHARACTER U+66
fPlain
fU+0066CHARACTER U+66
iPlain
iU+0069CHARACTER U+69
Plain
U+0020CHARACTER U+20
lPlain
lU+006CCHARACTER U+6C
iPlain
iU+0069CHARACTER U+69
gPlain
gU+0067CHARACTER U+67
aPlain
aU+0061CHARACTER U+61
tPlain
tU+0074CHARACTER U+74
uPlain
uU+0075CHARACTER U+75
rPlain
rU+0072CHARACTER U+72
ePlain
eU+0065CHARACTER U+65
sPlain
sU+0073CHARACTER U+73
)Plain
)U+0029CHARACTER U+29

The Architecture of OpenType Ligatures & Complex Text Layout (CTL)

Unlike simple Western Latin scripts where each character maps 1-to-1 to a static visual font box, Complex Text Layout (CTL) scripts (including Arabic, Urdu Nastaliq, Persian, Devanagari, and Khmer) require dynamic context-sensitive glyph shaping:

1. Zero-Width Joiner (ZWJ U+200D):Forces cursive joining between characters that would normally stand isolated (e.g. creating Emoji compound sequences like 👩 + ZWJ + 🚀 = 👩‍🚀 Astronaut).
2. Zero-Width Non-Joiner (ZWNJ U+200C):Explicitly breaks cursive joining between adjacent letters without introducing a full visual whitespace (essential for Persian suffixes like می‌خواهم).

How Modern Text Shapers (HarfBuzz & CoreText) Render Glyphs

Modern web browsers and operating systems use HarfBuzz to parse OpenType font tables:

  • GSUB (Glyph Substitution): Replaces sequences of characters with custom ligatures (e.g. f + i → fi, ).
  • GPOS (Glyph Positioning): Precisely positions diacritics (Arabic Zabar/Zer or Devanagari Matras) above/below consonants.

Frequently Asked Questions (FAQs)

How do I insert invisible ZWJ or ZWNJ characters into text?+

Click the "+ ZWJ (U+200D)" or "+ ZWNJ (U+200C)" button in our top action bar. The invisible control character will be appended into the text buffer at your current cursor position.

Why does my font fail to display ligatures correctly?+

Ligatures require font-level support via OpenType GSUB tables. If your selected font does not contain specific ligature glyphs, the text shaper falls back to rendering individual disconnected characters.

Can this tool disassemble complex Emoji sequences?+

Yes! Paste any combined emoji (like 👨‍👩‍👧‍👦 or 🏳️‍🌈) into the editor. The cluster decomposition cards will display every individual constituent emoji and ZWJ glue codepoint.