Last copied
nothing yet. copy anything below.

Blank and invisible characters

There is no single invisible character, and the difference between them is the difference between a name that works and a file that will not parse. Eight of them are below with what each is for and what each breaks. Press copy to take one: nothing will look as though it happened, which is the point.

Braille Pattern Blank U+2800

blank, one character wide

Use it for: The safe default for an empty-looking name or message. It is a Braille cell with no dots raised, so it is a real printing character rather than a space, and code that trims whitespace leaves it alone.

What it breaks: Fonts without Braille coverage draw a box. It is not a space, so it will not collapse or wrap like one.

Hangul Filler U+3164

blank, one character wide

Use it for: The other widely accepted blank. Korean Jamo filler, invisible in almost every font, and the one that tends to work where a platform rejects U+2800.

What it breaks: Some platforms normalise Hangul and strip it. Test before you rely on it.

Zero Width Space U+200B

zero width

Use it for: A line-break opportunity with no width. Its real use is telling a renderer where a long unbroken string such as a URL may wrap.

What it breaks: It is a word boundary, so it silently breaks Ctrl+F, copy-paste and string comparison. Text that looks identical stops matching. Do not use it as a blank.

Word Joiner U+2060

zero width

Use it for: The opposite of the zero width space: it forbids a break at that point without adding width. This is the correct character for gluing two things together.

What it breaks: Invisible to a reader and invisible in a diff, which makes it a nuisance to debug.

Zero Width No-Break Space U+FEFF

zero width

Use it for: Only ever correct as the very first character of a file, where it is the byte order mark that declares the encoding.

What it breaks: Anywhere else it is a bug. At the start of a CSV it corrupts the first column name; in JSON it makes the parser fail on line 1. Unicode deprecated its use as a joiner and U+2060 replaced it.

No-Break Space U+00A0

one space wide

Use it for: A space that will not break across lines. Correct between a number and its unit, or in a name that must stay on one line.

What it breaks: It is visible: it takes a space's width. It is not a blank character, and pasting it into code where an ordinary space is expected is a classic silent syntax error.

Figure Space U+2007

as wide as one digit

Use it for: Padding that lines up columns of numbers, because it is exactly the width of a digit in the same font.

What it breaks: Wider than a normal space in most faces, so it looks wrong in prose.

Zero Width Joiner U+200D

zero width

Use it for: The character that builds the compound emoji: a family or a profession is several emoji joined with this between them.

What it breaks: On its own it does nothing visible and may be stripped. It is not a blank character and should not be used as one.

Which one do you actually want

An empty-looking username, or a message that appears blank. Use U+2800, and U+3164 where that is rejected. Both are ordinary printing characters, so a platform that trims whitespace will not strip them. A zero-width character is the wrong choice here: many platforms treat a name made only of zero-width characters as empty and refuse it.

Somewhere for a long line to wrap. U+200B, and accept that it breaks searching within the text.

Two things that must not be separated. U+2060 for no added width, or U+00A0 where a space is wanted anyway.

Nothing. If a field will accept an ordinary space, use one. An invisible character is a workaround for a validator, and it travels into every system that later reads the field.

Why these break things quietly

None of these characters is visible, so none of them is visible in a bug either. A zero width space pasted into a password field is a wrong password with no wrong characters on screen. A byte order mark at the top of a CSV renames the first column to something that no longer matches your code. Two strings that look identical stop comparing equal, and no amount of staring at them explains it.

The way to see them is to stop trusting your eyes: paste the text into a hex viewer, or run it through a codepoint dump. Every character on this site has its codepoint printed beside it for that reason, and the character API returns the codepoint for anything you can paste into it.

Namepoint at any character
Unicode—
Windows—
Mac—
HTML—
COPIED