The Unicode codespace is the set of numbers that can ever be codepoints: every integer from U+0000 to U+10FFFF, which is 1,114,112 values. That ceiling will not move. It is fixed by UTF-16, which can reach exactly this far with a surrogate pair and no further, and the other encoding forms were limited to the same range so that every encoding can represent every codepoint. There is no U+110000: a search for it, or a “character” beyond it, is always an error.

Seventeen planes

The codespace is divided into 17 planes of 65,536 codepoints each. The first four hex digits of a six-digit codepoint are the plane number: U+1F600 is in plane 1, U+2A6D6 in plane 2. Plane 0, the Basic Multilingual Plane, holds everything that fits in four hex digits and was the whole of Unicode until version 2.0. Planes 4 to 13 are still completely empty. Each plane is further divided into named blocks.

PlaneRangeNameBlocksCharactersContents
0U+0000–U+FFFFBasic Multilingual Plane (BMP)16455,591Almost every modern script, punctuation, most symbols, the first CJK ideographs and the surrogate range.
1U+10000–U+1FFFFSupplementary Multilingual Plane (SMP)16128,444Historic scripts, musical and mathematical notation, and nearly all emoji.
2U+20000–U+2FFFFSupplementary Ideographic Plane (SIP)761,495Rare and historic CJK ideographs (Extensions B–F and I).
3U+30000–U+3FFFFTertiary Ideographic Plane (TIP)29,131Further CJK ideographs (Extensions G and H).
4U+40000–U+4FFFFUnassigned00No characters assigned yet.
5U+50000–U+5FFFFUnassigned00No characters assigned yet.
6U+60000–U+6FFFFUnassigned00No characters assigned yet.
7U+70000–U+7FFFFUnassigned00No characters assigned yet.
8U+80000–U+8FFFFUnassigned00No characters assigned yet.
9U+90000–U+9FFFFUnassigned00No characters assigned yet.
10U+A0000–U+AFFFFUnassigned00No characters assigned yet.
11U+B0000–U+BFFFFUnassigned00No characters assigned yet.
12U+C0000–U+CFFFFUnassigned00No characters assigned yet.
13U+D0000–U+DFFFFUnassigned00No characters assigned yet.
14U+E0000–U+EFFFFSupplementary Special-purpose Plane (SSP)2337Tag characters and the variation selectors supplement.
15U+F0000–U+FFFFFSupplementary Private Use Area-A (PUA-A)10Private use: no standard meaning.
16U+100000–U+10FFFFSupplementary Private Use Area-B (PUA-B)10Private use: no standard meaning.

How the 1,114,112 codepoints are used

In Unicode 16.0 the codespace breaks down as follows. Characters fill about 14% of it; counting private use, surrogates and the other reserved codepoints, about 26% is allocated.

154,998 characters
Graphic and format characters — letters, marks, digits, punctuation, symbols, emoji and invisible format controls. This is the number usually quoted as “the number of characters in Unicode”. 5,185 of them were added in version 16.0.
65 control codes
The C0 and C1 controls inherited from ASCII and ISO 8859, such as U+000A LINE FEED. They are assigned but are not counted as characters.
137,468 private-use codepoints
Reserved for private agreements between applications and fonts: 6,400 in the BMP plus all of planes 15 and 16. See the Private Use Area guide.
2,048 surrogate codepoints
U+D800–U+DFFF, reserved so that UTF-16 can encode planes 1–16. They are not characters and are invalid on their own in any encoding.
66 noncharacters
U+FDD0–U+FDEF plus the last two codepoints of every plane (U+FFFE, U+FFFF, U+1FFFE … U+10FFFF). They are permanently reserved for internal use by software, for example as sentinels, and should not appear in interchanged text.
819,467 unassigned codepoints
Available for future versions. New characters are added every year; at the current pace of a few thousand a year, the codespace will last for well over a century.

Why it matters in code

The plane determines the encoded size. Every BMP character takes one 16-bit unit in UTF-16 and one to three bytes in UTF-8; every character in planes 1–16 takes a surrogate pair (two units) in UTF-16 and exactly four bytes in UTF-8. That is why "😀".length is 2 in JavaScript and why MySQL’s legacy utf8 charset, which stores at most three bytes per character, cannot hold emoji — use utf8mb4. See UTF-8, UTF-16 and UTF-32 compared.

When validating input, reject values above 0x10FFFF, lone surrogates, and — depending on your protocol — noncharacters. When iterating over text, step by codepoint (or better, by grapheme cluster) rather than by 16-bit unit.

Further reading