The current SindhiKeyboardOnline layout includes two keys labelled ZWJ and ZWNJ. They do not display a visible letter. Instead, they insert invisible Unicode formatting characters that can influence how joining behavior is handled in cursive scripts.
The two characters
| Key | Code point | Name | Visible glyph? |
|---|---|---|---|
| ZWJ | U+200D | ZERO WIDTH JOINER | No |
| ZWNJ | U+200C | ZERO WIDTH NON-JOINER | No |
Why they exist
Unicode’s text model separates the underlying character sequence from its visual shaping. Arabic-script text is normally displayed using right-to-left behavior and contextual shaping. Unicode also provides format characters for situations where the normal joining behavior is not enough.
The Unicode Bidirectional Algorithm explains how right-to-left text is ordered, while shaping of cursively connected scripts is handled according to the script’s joining behavior. See Unicode UAX #9.
When should you use them?
Do not insert ZWJ or ZWNJ simply because they look technical. They are useful when a specific text sequence requires control over joining or when a Unicode-aware workflow expects them. Adding invisible characters randomly can create strings that compare differently from the same visible text without the controls.
How to test safely
- Start with a normal Sindhi word or phrase.
- Copy it before adding any invisible character.
- Place the cursor where you need the control.
- Insert ZWJ or ZWNJ from the keyboard.
- Compare the result visually and when copying it back into a plain-text field.
If you are unsure whether a character sequence contains an invisible control, use a Unicode/code-point inspection tool or compare the text programmatically rather than relying only on what the font displays.
For more context, read Unicode vs non-Unicode text and Sindhi Typing Problems and Fixes.
Joining is a shaping property, not a separate letter
Arabic-script letters can take different contextual forms depending on neighboring characters. Unicode describes this through joining properties and rendering rules. ZWJ and ZWNJ are controls that participate in this system; they are not replacement letters and should not be treated as ordinary alphabet characters.
Unicode's Arabic-script chapter identifies U+200D ZERO WIDTH JOINER as a join-causing character and U+200C ZERO WIDTH NON-JOINER as non-joining. It also explains that these controls can affect how cursive connections are rendered. See the Unicode Arabic-script specification.
The practical difference
Think of ZWJ as a request that can enable a connection in a suitable context, while ZWNJ prevents a cursive connection between adjacent characters. The actual visual result still depends on the characters, font, and shaping implementation involved. A control does not guarantee a particular glyph design.
How to debug invisible controls
If two strings look identical but behave differently when copied or compared, invisible characters are worth checking. Place each string in a code-point inspection tool, or compare their character sequences programmatically. This is more reliable than trying to diagnose an invisible character from a screenshot.
Primary References
This page uses the Unicode Standard as its technical reference where Unicode character identities, code points, bidirectional behavior, or Arabic-script annotations are discussed.
- Unicode Standard — Chapter 9: Arabic script
- Unicode 18.0 Arabic character names and annotations
- Unicode Standard Annex #9 — Bidirectional Algorithm
Reference links reviewed: September 2026