What is the zero-width non-joiner (U+200C)?
The zero-width non-joiner (ZWNJ, U+200C) is a Unicode format character with no visible glyph of its own. Unicode added it in version 1.1 (1993), in the General Punctuation block, precisely so that scripts where letters normally connect into cursive shapes could tell a renderer: stop joining here, but do not add a space — placed between two letters that would otherwise ligate, it forces each into its standalone or final presentation form. Its counterpart, the zero-width joiner (U+200D), does the opposite — it can force a join, or in emoji sequences, glue separate pictographs into one combined emoji. See the zero-width space guide for how U+200D behaves outside emoji.
That single job — un-joining without spacing — is what makes U+200C different from every other character on the invisible Unicode characters list. Most invisible characters are pure baggage anywhere they appear. U+200C is baggage in English prose, but load-bearing inside the words of several major writing systems.
Why Persian and Indic scripts need it
Arabic-script letters normally connect to their neighbors, changing shape depending on whether they sit at the start, middle, or end of a connected run. Persian compound words — including common verb forms built from two parts — are meant to be read and searched as one word, but their two halves must not cursively connect at the seam. Typing a normal space would split them into two separate words for search and spell-check; U+200C keeps them as one word while forcing correct, unconnected letterforms at the boundary.
Devanagari, Bengali, and other Indic scripts use it for a related but distinct purpose: inserting U+200C directly after a halant (virama) character blocks the automatic ligature that would otherwise fuse two consonants into a single conjunct glyph, and forces the visible halant form instead. Strip the character from that context and the rendered word changes — not just its spacing, its actual letter shapes.
The need was recognized early enough that HTML itself standardized a named entity for it — ‌ — alongside the zero-width joiner, so authors could write it directly into markup rather than relying on an invisible raw byte; see the 1997 HTML internationalization RFC that introduced it.
| Script family | What U+200C controls | Effect of removing it |
|---|---|---|
| Persian / Arabic-script | Blocks cursive joining between two word parts | Letters visually merge at a boundary meant to stay separate |
| Devanagari, Bengali, other Indic | Forces a visible halant instead of a conjunct ligature | Two consonants fuse into one glyph the writer didn't intend |
| Latin-script prose (English, etc.) | Nothing — no cursive joining behavior to control | No visible change; safe to remove as copy-paste debris |
How U+200C ends up in ordinary text
Outside Persian, Arabic, and Indic-script content, U+200C almost always arrives as copy-paste residue rather than intentional formatting — carried over from a web page's HTML, a PDF export, a translation memory tool, or a CMS editor that inserted it and left it behind when the visible text was edited. It has no effect on English letterforms, so it sits invisibly inside a word or sentence until something like a search, string comparison, or code diff fails for no visible reason — the same class of problem covered in the general guide to removing invisible characters.
How to remove U+200C without breaking Persian or Indic text
CleanPastedText detects U+200C by name and reports it in the "What changed" table whether it gets removed or kept. Because removing it is only safe in some scripts, it has its own control in Advanced Controls, separate from the general invisible-characters toggle: switch off "Joiners (ZWNJ/ZWJ)" and U+200C and U+200D are left untouched outside emoji sequences, while every other cleaning rule — hidden characters, BiDi controls, typography — keeps running as normal. The full mechanics of what gets checked and in what order are covered in how the cleaning engine works.
If you're not sure whether your text depends on it, paste it in and check the report before changing any settings — a "kept" or "removed" label next to U+200C tells you exactly what happened, so nothing is stripped silently.