Skip to main content

Reference

Zero Width Joiner (U+200D)

CleanPastedText editorial · Updated

Text workbench

Try it on your text

Cleaning mode

Removes invisible and unsafe characters while keeping more formatting.

Try a real example

Each sample contains a problem you cannot see.

Original

Pasted text

0 chars · 0 words

Cleaned

Ready to copy

0 changes

Text stays in this browser

Same words · No AI rewriting · No content logging

What is the zero-width joiner?

The zero-width joiner (ZWJ) is U+200D, an invisible character that tells a text renderer to connect its neighbours. It has no width and no glyph. Its effect is on the characters around it: in a script with cursive joining it can force a joined form, and in emoji it can turn a run of separate pictographs into one combined symbol.

How does it build emoji?

Many emoji people think of as single symbols are ZWJ sequences: several emoji joined by U+200D. If the platform font has a glyph for the whole sequence, you see one image. If not, you see the parts one after another.

Combined emojiMade ofIf U+200D is stripped
FamilyAdult + ZWJ + adult + ZWJ + childThree separate people
Woman technologistWoman + ZWJ + laptopA woman next to a laptop
Rainbow flagWhite flag + variation selector + ZWJ + rainbowA white flag and a rainbow

The full rules live in the Unicode emoji technical report (UTS #51).

Where does a stray ZWJ come from?

In English prose a U+200D is almost never intended. It arrives from copied web pages, CMS editors, translation tools, PDFs, or from text that once contained an emoji that was later deleted. It also appears in the character lists used for hidden-text tricks, which is why it sits on the invisible characters list. It causes the same failures as the zero-width space: searches that miss, comparisons that fail, and lengths that count more than you see.

How to remove U+200D without breaking emoji

Paste the text into the cleaner above. Outside emoji, each U+200D is removed and counted in the report. Inside an emoji sequence it is kept. If your text is Persian, Hindi, Bengali or another language that relies on joiners, open Advanced Controls and turn off Joiners (ZWNJ/ZWJ). The companion character is covered on the zero-width non-joiner page.

For code, a naive text.replace(/\u200D/g, "") will remove the joiner from emoji as well. If emoji matter, remove it only where it is not between two emoji code points, or use a library that understands emoji sequences.

Is a ZWJ ever a security problem?

On its own it is harmless. Attackers sometimes hide data in runs of zero-width characters, which is why cleaners flag them. That is a different technique from the tag-character and variation-selector tricks covered in ASCII smuggling explained, but the fix is the same: detect, report, and remove what you do not need.

Common questions

Frequently asked questions

What is the zero-width joiner?

The zero-width joiner, U+200D or ZWJ, is a Unicode format character with no visible glyph. It requests that the characters on either side be joined into a single connected form if the font supports it. It is used in emoji sequences and in scripts such as Devanagari, Bengali and Arabic-script languages.

Why do emoji use the zero-width joiner?

Many emoji are sequences of simpler emoji glued by U+200D. A family emoji is person, ZWJ, person, ZWJ, child; a woman technologist is woman, ZWJ, laptop. A system with the right font draws one image. A system without it shows the parts side by side. The joiner itself is never drawn.

Can I safely remove all U+200D characters?

Not from text that contains emoji or from Indic-script and some Arabic-script words. A blanket removal splits combined emoji into separate ones and can change how those words are shaped. In plain English prose, a stray U+200D is almost always copy-paste debris and can go. Removing it only outside emoji sequences avoids the damage.

How do I remove U+200D but keep my emoji?

Use a tool that is emoji-aware. CleanPastedText removes U+200D outside emoji sequences and leaves it inside them, so family and profession emoji stay whole. If your text uses a script that depends on the joiner, turn off 'Joiners (ZWNJ/ZWJ)' in Advanced Controls and it will be left alone.

What is the difference between U+200D and U+200C?

They are opposites. U+200D, the joiner, asks neighbouring characters to connect. U+200C, the non-joiner, asks them not to connect. Both are invisible, both need to be kept in some scripts, and both are safe to remove from ordinary Latin-script prose. They also have different roles in emoji: only the joiner builds sequences.

Continue reading

Related guides & tools