Skip to content
Ghostchars

Joiners, selectors and fillers

ZERO WIDTH NON-JOINER (U+200C)

The opposite of the joiner: an invisible character that forbids two neighbours from being drawn as one connected form.

Codepoint
U+200C
Also written as
u200c\u200c‌
Removed by default
When free-floating
Governing option
Aggressive -a
Can be load-bearing
Yes

Copy and paste U+200C

To copy and paste ZERO WIDTH NON-JOINER (U+200C), press the button: the character itself goes to your clipboard, and Ctrl+V (Cmd+V on a Mac) pastes it anywhere you can type.

Where it comes from

Persian above all, where it separates the parts of a compound word: "می‌روم" is spelled with one and means something different without it. Also German (to block an unwanted ligature), Hindi, and zero-width steganography, where it is the "0" to the joiner's "1".

Why it matters

In Persian it is orthography: removing it merges two words into one wrong word. In English prose it is invisible padding with no function at all. The same codepoint, two completely different verdicts, which is the whole argument for context-aware cleaning.

Before and after

ZERO WIDTH NON-JOINER (U+200C) before and after cleaning, with the hidden character shown as a labelled chip
Reference card for this character: the codepoint, the verdict, and the same before and after in one image.
BeforeinU+200Cvisible
Afterinvisible

Between two Latin letters a non-joiner has nothing to disconnect, so it is removed. Between two Persian letters it is the spelling.

The character is shown as a labelled chip so you can see where it sits. In your text it draws nothing at all.

When it is legitimate

Between two letters of the same joining script. Persian plural and continuous-tense forms depend on it, and so does correct Hindi conjunct behaviour.

How to remove it

Free-floating occurrences go in the default pass. Ones between two letters of a joining script are kept and reported; `-a` removes them too.

Working in a file rather than a paste? The document report for .docx, .odt and .html finds it inside the file, together with hidden runs and tracked changes, without you having to open it. If the question is what the rest of the writing does rather than what this one character does, measure sentence-length variation and see where each habit sits, with no score and no claim about who wrote the text.

Is it an AI watermark?

Used to hide data, but is not a watermark

No. It is standard Persian orthography and a standard stego symbol. Which of the two you are looking at is decided by the neighbours, not by who wrote the sentence.

A known carrier for deliberately hidden payloads. Someone put it there on purpose, which is a different question from who wrote the words.

Questions

Is it safe to clean Persian text?

Yes, with the default settings: a non-joiner between two Arabic-script letters is kept and reported as load-bearing. Turning on `-a` would remove it and change the spelling.

What about German ligature suppression?

Between two Latin letters, Ghostchars removes it. If you are typesetting and need "Auflage" without the fl ligature, do that in the layout tool rather than in the text.

Check your own text

Paste anything into the cleaner to see every hidden character it contains, with position, codepoint and what happens to each one. Nothing is uploaded.

Check your own textClean it in Chrome as you pasteClean it on your Mac with one keystrokeAll characters

Anonymous usage stats?

Ghostchars processes your text in the browser and never uploads it. We would like to count page views with a self-hosted, cookie-light analytics endpoint. No content, ever.