Arabic Script

Arabic is an abjad written right to left, like Hebrew, but it adds a mechanism Hebrew doesn't have: true cursive joining. Nearly every letter changes shape depending on whether it opens, sits inside, closes, or stands alone in a word, and a shaping engine has to pick the right one automatically, in real time, for every letter in every word. This article covers that joining system, the required ligatures it produces, and what a font needs to get it right.

Fast facts

Arabic, in one screen

An abjad with true cursive joining: most letters take up to four different shapes depending on position.

ISO 15924
Arab, roughly 1,413 characters, script type abjad
Languages
Primary script for Arabic, Persian, and Urdu; also Pashto and others
Direction
Right to left, with genuine cursive joining between letters
Signature complexity
Isolated, initial, medial, and final forms, chosen automatically by context, not typed separately
1.Letters

Arabic has 28 base letters, plus several hamza-carrying letters that behave as their own units in shaping. A user types a single, unchanging code point for each letter. The visual form that appears, isolated, initial, medial, or final, is chosen entirely by the shaping engine based on what comes before and after it. This is the core difference from Latin bold or italic, which a user selects: Arabic joining is automatic and mandatory.

The 28 base letters
اalef
بba
تta
ثtha
جjim
حha
خkha
دdal
ذdhal
رra
زzay
سsin
شshin
صsad
ضdad
طta (emphatic)
ظza (emphatic)
عayn
غghayn
فfa
قqaf
كkaf
لlam
مmim
نnun
هha
وwaw
يya
Hamza-carrying letters
ءhamza
آalef madda
أalef hamza above
ؤwaw hamza
إalef hamza below
ئya hamza
ةta marbuta
ىalef maksura
Not shown
Harakat (short-vowel diacritics), the shadda (gemination mark), and the extended letters Persian and Urdu add for sounds Arabic doesn't have. Each of those adds its own mark-placement or joining behavior on top of what's covered here.
2.What makes Arabic distinctive: joining is mandatory, not optional

Six letters in the alphabet (alef, dal, dhal, ra, zay, and waw) only ever connect to the letter before them, never to the one after, which breaks a word into visually separate "runs" even though it's a single connected word linguistically. Every other letter joins on both sides when its neighbors allow it. A shaping engine has to track this letter by letter across an entire word and select the correct isolated, initial, medial, or final glyph for each one, every time the word is rendered.

This is structurally different from anything in this track so far. Latin and Cyrillic never change a letter's shape based on neighbors. Hebrew doesn't either. Arabic's default state, mid-word, mid-run, is the joined form, and the isolated form a person sees in a type specimen or an alphabet chart is actually the exception.

3.Visual anatomy: one letter, four shapes

ع (ayn) makes the joining behavior easy to see because its four forms are visually distinct from each other, not just lightly modified.

Arabic positional forms of the letter ayn The Arabic letter ayn shown in its four positional forms: isolated, initial, medial, and final, illustrating how the same code point takes different shapes depending on its neighbors. Visual anatomy ع in four positions ع Isolated ‍عـ Initial ـعـ Medial ـع Final

A reader never chooses among these, the shaping engine resolves the correct form automatically from the letters on either side. The isolated form is the only one that ever appears alone.

4.Cursive joining and the lam-alef ligature
السلام
Connected joining
Every letter flows into the next in one unbroken run
لا
Lam-alef ligature
Required, not optional: renders as one fused shape
الكتاب
Mixed run and break
Alef and lam interrupt joining, kaf/ta/alef/ba continue it

لا (lam followed by alef) is the clearest required ligature in the script: rather than drawing lam's final form next to alef's isolated form, type design fuses them into a single glyph shape. Leaving it unfused is a visible, immediately recognizable error to any Arabic reader.

5.Kashida and justification

Arabic text is commonly justified by stretching the joining strokes between letters rather than by adding space between words, the way Latin justification does. This uses the kashida (also called tatweel), a horizontal elongation character that lengthens a connector without changing which letters are present. A font intended for justified Arabic setting needs kashida-aware connecting strokes, or justified paragraphs will visibly break at the joins.

6.The shaping model for Arabic

Arabic's OpenType feature list is built around one core job: resolving positional forms correctly for every letter in every word, then layering required ligatures and optional stylistic variation on top.

FeatureTagWhat it builds here
Isolated formsisolSelects a letter's standalone shape when it joins to nothing.
Initial formsinitSelects the shape a letter takes when it opens a joined run.
Medial formsmediSelects the shape a letter takes inside a joined run.
Final formsfinaSelects the shape a letter takes when it closes a joined run.
Required ligaturesrligBuilds mandatory fused shapes such as lam-alef.
Mark positioningmarkAnchors harakat and the shadda to their base letters.
Cursive positioningcursAligns connecting strokes between joined letterforms.
Stylistic setsss01-ss20Regional style variation, such as Persian or Urdu (Nastaliq) letterform preferences.
7.Rendering pitfalls
SymptomLikely causeFix
Letters appear disconnected or in isolated form throughout a wordShaping engine not applying init/medi/fina substitutionsConfirm the text layout pipeline runs full Arabic shaping, not a naive per-character render
لا renders as two separate letters instead of one fused shapeRequired rlig ligature missing or not appliedVerify lam-alef and other mandatory ligatures are built and enabled
Justified paragraphs show gaps at word joins instead of stretched connectorsNo kashida-aware justification, only word-spacing usedSupport kashida insertion for justified Arabic text
Harakat marks float away from their letters or overlapMark anchors untested against real vowel-pointed textTest fully voweled Quranic or pedagogical text, not just unvoweled prose
Persian or Urdu text uses the wrong regional letterformsFont ships only Arabic-language conventionsAdd language-specific forms via stylistic sets or locl for each target language
Practical rule
Never test Arabic rendering with isolated letters alone. Test full connected words, joining bugs are invisible until letters actually sit next to each other.
8.Design and production checklist
  1. 1Draw isolated, initial, medial, and final forms for every joining letter, and the isolated-plus-final pair for non-joining ones.
  2. 2Build required ligatures, lam-alef first, then check for others your target languages need.
  3. 3Tune cursive connector alignment so strokes meet cleanly across every letter pair.
  4. 4Support kashida-based justification if the font targets justified paragraph text.
  5. 5Test harakat placement on fully voweled text, not just everyday unvoweled prose.
  6. 6Review with a fluent reader across full connected words, never isolated glyphs alone.
9.Test strings

Copy these into a test document. Each targets a different part of the coverage and shaping surface covered above.

السلام عليكمConnected joining across a full phrase
لا إله إلا اللهRepeated lam-alef ligature
الْكِتَابُFull harakat vowel pointing
جميل جداًNon-joining letters breaking a run
مرحباً بالعالم 2026Mixed Arabic and numerals, bidi check
پاکستان، فارسیPersian/Urdu extended letters