Invisible & Space Characters
A guide to invisible Unicode characters and special spaces, including non-breaking spaces, zero-width characters, joiners, directional marks, mathematical operators, soft hyphens, and variation selectors.
What Are Invisible Characters?
Invisible characters are characters that affect text even though they may produce no visible mark of their own. They can control spacing, line breaking, character joining, writing direction, emoji presentation, mathematical interpretation, hyphenation, and other aspects of text processing.
“Invisible character” is a useful descriptive term, but it is not a single formal Unicode category. Characters that appear invisible can belong to several different groups, including spaces, formatting controls, joiners, directional controls, variation selectors, invisible mathematical operators, and other special-purpose characters.
Some invisible characters are completely intentional and essential for correct text rendering. Others appear unexpectedly after copying text between websites, documents, messaging applications, spreadsheets, or source-code editors.
Common Invisible and Special Space Characters
| Code point | Name | Common function |
|---|---|---|
| U+0020 | SPACE | Ordinary visible-width word space |
| U+00A0 | NO-BREAK SPACE | Space that normally prevents a line break |
| U+00AD | SOFT HYPHEN | Indicates a possible hyphenation point and is often invisible otherwise |
| U+200B | ZERO WIDTH SPACE | Provides a word or line-break opportunity without an ordinary visible space |
| U+200C | ZERO WIDTH NON-JOINER | Discourages joining or ligature behavior between surrounding characters |
| U+200D | ZERO WIDTH JOINER | Encourages particular joining or combined rendering behavior |
| U+200E | LEFT-TO-RIGHT MARK | Invisible directional formatting mark |
| U+200F | RIGHT-TO-LEFT MARK | Invisible directional formatting mark |
| U+202F | NARROW NO-BREAK SPACE | Narrow space that normally prevents a line break |
| U+2060 | WORD JOINER | Zero-width character used to prevent a line break between surrounding text |
| U+2061 | FUNCTION APPLICATION | Invisible mathematical operator representing function application |
| U+2062 | INVISIBLE TIMES | Invisible mathematical multiplication operator |
| U+2063 | INVISIBLE SEPARATOR | Invisible separator used in mathematical notation |
| U+2064 | INVISIBLE PLUS | Invisible mathematical addition operator |
| U+FE0E | VARIATION SELECTOR-15 | Requests text-style presentation in applicable sequences |
| U+FE0F | VARIATION SELECTOR-16 | Requests emoji-style presentation in applicable sequences |
| U+FEFF | ZERO WIDTH NO-BREAK SPACE | Primarily encountered as a byte order mark at the start of text; legacy word-joining behavior is retained for compatibility |
Regular Space vs No-Break Space
An ordinary space and a no-break space usually look the same on screen, but they behave differently.
U+0020 SPACE allows normal line-breaking behavior.
U+00A0 NO-BREAK SPACE, commonly abbreviated NBSP, normally keeps the surrounding text together instead of allowing a line break at that position.
In HTML, the familiar entity represents a no-break space.
This can explain why a piece of text refuses to wrap where expected even though it appears to contain an ordinary space.
Unicode Has Many Different Space Characters
Not every blank area in Unicode is the same character. Unicode defines several spacing characters with different intended widths or behaviors.
| Code point | Name | Typical characteristic |
|---|---|---|
| U+0020 | SPACE | Ordinary space |
| U+00A0 | NO-BREAK SPACE | Ordinary-style space with no-break behavior |
| U+2002 | EN SPACE | Typographic space related to an en width |
| U+2003 | EM SPACE | Typographic space related to an em width |
| U+2007 | FIGURE SPACE | Space associated with the width of tabular digits |
| U+2008 | PUNCTUATION SPACE | Space associated with narrow punctuation width |
| U+2009 | THIN SPACE | Narrow typographic space |
| U+200A | HAIR SPACE | Very narrow typographic space |
| U+202F | NARROW NO-BREAK SPACE | Narrow spacing with no-break behavior |
| U+205F | MEDIUM MATHEMATICAL SPACE | Space intended for mathematical typography |
| U+3000 | IDEOGRAPHIC SPACE | Full-width space used in East Asian text contexts |
The exact visual width of some spaces can depend on the font and rendering system.
Zero Width Space U+200B
The zero width space, abbreviated ZWSP, normally occupies no visible width.
Its main purpose is not to create a visible gap. Instead, it can indicate a place where a word or line break is permitted even though an ordinary space is not displayed.
This is useful in writing systems and text-processing situations where visible spaces are not the normal way to mark word boundaries.
A zero width space can also appear unexpectedly in copied text. Because it cannot normally be seen, users may not understand why two apparently identical strings behave differently.
Word Joiner U+2060
The word joiner, abbreviated WJ, also has no visible width, but its behavior is almost the opposite of a zero width space.
Rather than introducing an additional break opportunity, the word joiner is used to prevent a line break between surrounding characters.
| Character | General line-breaking role |
|---|---|
| ZERO WIDTH SPACE | Can provide a break opportunity |
| WORD JOINER | Prevents a break |
They are both invisible and zero-width in normal display, but they perform different functions.
Invisible Mathematical Operators
Unicode includes several invisible characters designed specifically to represent mathematical operations that may be implied visually rather than written with an ordinary visible operator.
| Code point | Name | Purpose |
|---|---|---|
| U+2061 | FUNCTION APPLICATION | Indicates that a function is being applied to an argument |
| U+2062 | INVISIBLE TIMES | Represents implied multiplication between adjacent mathematical expressions |
| U+2063 | INVISIBLE SEPARATOR | Represents an implied separator, such as between mathematical indices or list elements |
| U+2064 | INVISIBLE PLUS | Represents implied addition where visual juxtaposition could otherwise be ambiguous |
These characters normally produce no visible operator glyph. Their purpose is to preserve mathematical meaning in encoded text even when conventional mathematical typography leaves the operation visually implicit.
For example, ordinary mathematical notation may place two variables next to each other to imply multiplication. An encoded mathematical representation can use INVISIBLE TIMES to record that relationship explicitly without displaying a multiplication sign.
These invisible operators are especially relevant when mathematical text is processed by software, converted between formats, or interpreted by accessibility and mathematical-layout systems.
Zero Width Joiner U+200D
The zero width joiner, or ZWJ, influences how adjacent characters are rendered together.
In scripts with joining or ligature behavior, it can request a joined presentation that might not otherwise occur.
ZWJ is also important in emoji. Some emoji that appear as a single pictograph are actually sequences of multiple characters connected by zero width joiners.
The ZWJ itself is normally invisible. What the user sees is the effect it has on the characters around it.
Zero Width Non-Joiner U+200C
The zero width non-joiner, abbreviated ZWNJ, is used to inhibit joining behavior that might otherwise occur between adjacent characters.
It is particularly important in scripts where letter forms change according to joining context.
ZWJ and ZWNJ should not be confused with ZERO WIDTH SPACE. They affect character joining and shaping rather than simply providing invisible word spacing.
ZWSP vs ZWJ vs ZWNJ
| Abbreviation | Name | Main purpose |
|---|---|---|
| ZWSP | Zero Width Space | Invisible break opportunity |
| ZWJ | Zero Width Joiner | Influences joining or combined rendering |
| ZWNJ | Zero Width Non-Joiner | Inhibits joining behavior |
The similar names can make these characters easy to confuse, but their functions are fundamentally different.
Soft Hyphen U+00AD
The soft hyphen is an unusual character because it is often invisible until a word needs to break at the end of a line.
It marks a potential hyphenation location. If no line break occurs there, many rendering systems display nothing. If the word is broken at that point, a visible hyphen may be shown.
This can make copied text containing soft hyphens difficult to diagnose. A word may appear completely normal while containing an additional hidden character internally.
Directional Marks
Text that mixes left-to-right and right-to-left writing systems sometimes requires invisible characters that help determine directional behavior.
| Code point | Name | Abbreviation |
|---|---|---|
| U+200E | LEFT-TO-RIGHT MARK | LRM |
| U+200F | RIGHT-TO-LEFT MARK | RLM |
These characters do not normally create visible marks. Instead, they influence how surrounding bidirectional text is ordered and displayed.
Bidirectional Isolate Characters
Unicode also provides invisible isolate controls for text that mixes left-to-right and right-to-left writing directions.
| Code point | Name | Abbreviation |
|---|---|---|
| U+2066 | LEFT-TO-RIGHT ISOLATE | LRI |
| U+2067 | RIGHT-TO-LEFT ISOLATE | RLI |
| U+2068 | FIRST STRONG ISOLATE | FSI |
| U+2069 | POP DIRECTIONAL ISOLATE | PDI |
These controls help isolate a section of bidirectional text so that its directional behavior does not unexpectedly affect surrounding content.
Like LRM and RLM, these characters normally have no visible glyph of their own. Their effect becomes apparent through the ordering and layout of surrounding text.
Variation Selectors
Some invisible characters modify the presentation of the character immediately before them.
| Code point | Name | Common role |
|---|---|---|
| U+FE0E | VARIATION SELECTOR-15 | Requests text-style presentation where supported |
| U+FE0F | VARIATION SELECTOR-16 | Requests emoji-style presentation where supported |
The variation selector itself is not intended to appear as an independent visible symbol.
As a result, two strings can appear to contain the same visible character while one actually contains an additional variation selector.
U+FEFF and the Byte Order Mark
U+FEFF has a particularly complicated history.
Its Unicode name is ZERO WIDTH NO-BREAK SPACE. At the beginning of certain Unicode-encoded text streams, it can serve as a byte order mark, commonly called a BOM.
Historically, U+FEFF was also used for zero-width no-break behavior inside text. Modern Unicode provides U+2060 WORD JOINER for new text that needs this word-joining function.
This distinction matters because an unexpected U+FEFF at the beginning or inside a file may be related to encoding or legacy processing rather than ordinary spacing.
Why Invisible Characters Appear Unexpectedly
Hidden characters can enter text in many ordinary ways:
- copying from a website;
- copying from PDF or word-processing software;
- pasting formatted text into a plain-text field;
- using non-breaking spaces inserted automatically by an editor;
- working with multilingual or bidirectional text;
- copying emoji sequences;
- importing data from spreadsheets or databases;
- automatic hyphenation;
- text normalization and conversion between systems.
The presence of an invisible character does not automatically indicate corrupted or malicious text.
Why Two Identical-Looking Strings Can Be Different
Consider two strings that appear visually identical:
AB
AB
One could contain only the visible letters A and B, while another could contain an invisible character between them.
This difference may affect:
- search results;
- string comparison;
- usernames;
- filenames;
- passwords;
- database matching;
- source code;
- URLs;
- line wrapping;
- text rendering.
Visual inspection alone cannot reliably detect these differences.
Invisible Characters in Emoji Sequences
Some emoji are not single Unicode characters. They are sequences containing multiple emoji or symbol characters combined with invisible formatting characters such as ZERO WIDTH JOINER.
A family, profession, relationship, or other composite emoji may therefore contain several encoded characters even though the screen displays a single visual image.
Deleting one component of the sequence can cause the visual result to change substantially.
Invisible Characters and Security
Invisible and directional characters have legitimate purposes, but they can also create confusing text when inserted where users do not expect them.
For example, hidden characters may cause identifiers to differ while appearing similar, or directional controls may change the visual ordering of text.
Software handling identifiers, source code, security-sensitive values, or user input may therefore need to inspect Unicode code points rather than relying only on what is visibly displayed.
How to Find an Invisible Character
If text behaves unexpectedly, inspect it using a Unicode-aware tool that can display individual code points or reveal whitespace and formatting marks.
Useful clues include:
- the cursor requiring an extra key press to cross an apparently empty location;
- unexpected line wrapping;
- search failing to match apparently identical text;
- different character counts for visually identical strings;
- text changing when pasted into another editor;
- emoji changing when characters are deleted one at a time.
Identifying the exact code point is more reliable than trying to determine an invisible character from appearance alone.
Invisible Does Not Mean Empty
An invisible Unicode character is still data.
Even when it has no visible glyph, it may participate in text layout, rendering, searching, sorting, comparison, cursor movement, mathematical interpretation, or encoding.
This is the most important distinction to remember: an apparently blank location in text may contain nothing, an ordinary space, a special space, or one or more invisible formatting characters.
No published symbol guides are assigned to this category yet.