Zero-Width Characters Compared: ZWS vs ZWNJ vs ZWJ

Zero-width characters all share one trait. They normally have no visible width. Past that, they do completely different jobs. Mixing them up is an easy mistake to make, and it can cause unexpected results if you pick the wrong one.

This guide compares three common zero-width characters side by side. It focuses on what makes each one different, not on the full history of each character. For deeper detail on any single one, links to the full guide for each character are included below.

Quick Comparison Table

Each of these three characters is normally invisible. Their actual jobs are not related to each other at all.

CharacterCode PointWhat It Actually Does
Zero Width SpaceU+200BMarks an invisible spot where a line of text is allowed to break
Zero Width Non-JoinerU+200CPrevents joining or connecting behavior in supported scripts
Zero Width JoinerU+200DRequests joining or connecting behavior in supported scripts and sequences

Notice that two of these three characters, the non-joiner and the joiner, can do opposite jobs. One blocks joining. The other requests it. The space character is not related to joining at all. It provides an invisible line-break opportunity.

Why Each One Is Different

These three characters look identical when pasted into a text box. Under the surface, each one solves a completely separate problem.

Zero Width Space exists for line wrapping. Some languages do not use visible spaces between words. Zero width space can provide an invisible word or line-break opportunity where a normal space cannot be used. Unicode lists Thai, Myanmar, Khmer, and Japanese as examples of languages where it can be useful. A full explanation of this character, including its non-social uses and how it compares to other zero-width characters, is covered in a dedicated guide to zero width space.

Zero Width Non-Joiner exists to prevent joining in supported text. Some scripts naturally connect certain letters when they sit next to each other. A writer may need to stop that connection in a particular position. ZWNJ can request a non-joining form in supported scripts, including Arabic and Persian text.

Zero Width Joiner exists to request joining or connecting behavior in supported text. It can affect cursive connections and ligatures in some scripts. It is also used in many emoji ZWJ sequences, where a sequence of characters can produce a combined emoji when supported. A full breakdown of that emoji connection, along with its use in real scripts, is covered in a dedicated guide to zero width joiner.

None of these three characters were built with usernames or bios in mind. Their real jobs come from text shaping and line-wrapping systems. Their use in blank usernames today is a separate use that depends on how a platform handles the characters.

When to Use Which One

Picking the right character comes down to what you are actually trying to do, not which one simply looks blank.

If your goal is a blank-looking username, bio, or message, none of these three characters is guaranteed to work. Platform rules can accept, reject, remove, or change how invisible characters behave. The platform-by-platform comparison covers how different characters behave across supported platforms.

If you are working with text in a script that uses connected letterforms, the non-joiner and the joiner serve a real, specific technical purpose. These are not blank-username tools. Using either one outside of that context, just to create a blank space, may produce unexpected results, since that is not the job either character was built for.

If you want to understand the numbering system that defines every one of these characters, a guide to what Unicode actually is explains how code points work at a foundational level.

Zero-Width Characters Compared: Frequently Asked Questions

Are all zero-width characters interchangeable?

No. Each one has a distinct job. The joiner and non-joiner can produce opposite joining behavior, while zero width space is mainly used to provide an invisible line-break opportunity.

Which zero-width character works best for a blank username?

There is no single character that works best on every platform. Results depend on the platform, the field, and how it handles that particular Unicode character.

Why do zero-width characters exist at all if they are invisible?

They were built to control aspects of text layout, joining, and line breaking, not to be seen directly. Their lack of visible width is part of how they perform these functions.

Can using the wrong zero-width character break my text?

It can produce an unexpected result, such as characters joining or remaining separate in a way you did not intend. The effect depends on the script, character sequence, font, and rendering system.

Do these characters count toward a platform’s character limit?

They can. Whether they count toward a character limit depends on how the platform measures and processes characters in that field.