Joining Type
Unicode property controlling how Arabic and Syriac characters connect to adjacent characters. Types include Right_Joining, Left_Joining, Dual_Joining, and Non_Joining.
What is Joining Type?
Joining Type is a Unicode character property that describes how a character participates in the cursive joining behavior of Arabic-script (and other scripts that use connected cursive forms, such as Syriac, N'Ko, and Mongolian). It is fundamental to correct text shaping for Arabic and related scripts, because Arabic letters change their visual form depending on their position in a word — specifically, whether they connect to the letters before and after them.
The Unicode standard defines the Joining_Type property with six values, stored in ArabicShaping.txt in the Unicode Character Database.
The Six Joining Types
| Value | Abbreviation | Meaning | Example |
|---|---|---|---|
| Right_Joining | R | Connects to the preceding character only (right side) | ا (Alef, U+0627) |
| Left_Joining | L | Connects to the following character only (left side) | Rare; some extensions |
| Dual_Joining | D | Connects to both preceding and following characters | ب (Ba, U+0628) |
| Non_Joining | U | Does not connect to either neighbor | Space, Latin letters |
| Join_Causing | C | Causes joining but may not be visible | Zero Width Joiner (U+200D) |
| Transparent | T | Ignored for joining purposes; acts as if absent | Combining marks, some diacritics |
How Arabic Letters Change Shape
An Arabic letter's joining type, combined with its position in a joining sequence, determines which of up to four contextual glyph forms (allographs) the font renders:
- Isolated form: The letter appears alone or between non-joiners
- Initial form: The letter begins a joining sequence (connects to the right, toward the next letter)
- Medial form: The letter is in the middle of a sequence (connects on both sides)
- Final form: The letter ends a joining sequence (connects to the left, toward the previous letter)
For example, the Arabic letter Ba (ب, U+0628, Dual_Joining) appears as:
| Context | Form | Appearance |
|---|---|---|
| Standalone | Isolated | ب |
| Word-initial | Initial | بـ |
| Word-medial | Medial | ـبـ |
| Word-final | Final | ـب |
This shaping logic is implemented by text shaping engines like HarfBuzz, which is used by virtually every modern application that renders Arabic text (browsers, LibreOffice, Android, iOS).
Transparent Characters
Characters with Joining_Type=Transparent are critical for correct shaping. A Transparent character between two Dual_Joining letters does not break their connection — the joining algorithm "looks through" it. Arabic diacritical marks (tashkeel, like fatha ◌َ U+064E and shadda ◌ّ U+0651) are Transparent, allowing vocalized text to join exactly as the unvocalized base text would.
Zero Width Joiner and Non-Joiner
Two special-purpose characters control joining explicitly:
- ZWJ (U+200D, Zero Width Joiner) — Join_Causing: forces a joining connection where it would not otherwise occur
- ZWNJ (U+200C, Zero Width Non-Joiner) — causes a break in an otherwise-connecting sequence
Quick Facts
| Property | Value |
|---|---|
| Unicode property name | Joining_Type (jt) |
| Data file | ArabicShaping.txt in UCD |
| Primary affected scripts | Arabic, Syriac, N'Ko, Mongolian, Hanifi Rohingya |
| Dual_Joining letters | Most common Arabic consonants (ب، ت، ث، ج…) |
| Right_Joining letters | Alef (ا), Waw (و), Reh (ر), Zain (ز), Dal (د) |
| Shaping engine | HarfBuzz (universal), Uniscribe (Windows) |
| Force join | U+200D Zero Width Joiner |
| Break join | U+200C Zero Width Non-Joiner |
คำศัพท์ที่เกี่ยวข้อง
เพิ่มเติมใน คุณสมบัติ
Unicode property (UAX#11) classifying characters as Narrow, Wide, Fullwidth, Halfwidth, Ambiguous, or …
Unicode property listing all scripts that use a character, broader than the …
อักขระที่ผู้ใช้รับรู้ได้ — สิ่งที่รู้สึกเหมือนหน่วยเดียว อาจประกอบด้วยหลายจุดรหัส (ฐาน + เครื่องหมายรวม หรือลำดับ emoji ZWJ) 👩💻 = …
กฎสำหรับแปลงอักขระระหว่างตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก และตัวพิมพ์หัวเรื่อง อาจขึ้นอยู่กับ locale (ปัญหาตัว I ในภาษาตุรกี) และอาจเป็นแบบหนึ่ง-ต่อ-หลาย (ß → SS)
การแมปอักขระเป็นส่วนประกอบย่อย การแยกส่วนแบบ canonical รักษาความหมาย (é → e + ́) ในขณะที่การแยกส่วนแบบ compatibility อาจเปลี่ยนความหมาย …
ค่าตัวเลข (0–254) ที่ควบคุมลำดับของเครื่องหมายรวมระหว่างการแยกส่วนแบบ canonical กำหนดว่าเครื่องหมายรวมใดสามารถเรียงลำดับใหม่ได้
ลำดับอักขระสองชุดที่มีเนื้อหาเชิงนามธรรมเดียวกันแต่อาจแตกต่างในรูปลักษณ์ กว้างกว่าความเท่าเทียมแบบ canonical ตัวอย่าง: fi ≈ fi, ² ≈ 2
ลำดับอักขระสองชุดที่มีความหมายเหมือนกันและควรถือว่าเท่าเทียมกัน ตัวอย่าง: é (U+00E9) ≡ e + ◌́ (U+0065 + U+0301)
อักขระที่รูปร่างควรสะท้อนในแนวนอนในบริบท RTL ตัวอย่าง: ( → ), [ → ], { → }, …
เวอร์ชัน Unicode ที่มีการกำหนดอักขระเป็นครั้งแรก มีประโยชน์สำหรับการตรวจสอบการรองรับอักขระในระบบและซอฟต์แวร์เวอร์ชันต่างๆ