The unicode blocks behind styled text, and their gaps

Every style a fancy text generator offers is a set of real characters rather than a font, and almost all of them come from one place: a block of maths alphabets Unicode added in 2001. That block has gaps. Twenty-four letters are missing from it on purpose, because they already existed somewhere older, and how a generator handles those gaps decides whether a script name comes out whole, comes out in two styles at once, or comes out with a box in it.

Styled letters are characters, not a font

When you copy a bold name from a generator you are not copying formatting. You are copying different characters that happen to look bold. 𝐇 is not H in a heavier weight; it is MATHEMATICAL BOLD CAPITAL H, code point U+1D407, a separate character with its own number.

That is why the style survives a paste into a bio or a game name, where there is no formatting to carry it, and it is also the root of every limitation styled text has. The characters were encoded for mathematics, and everywhere else they still behave like maths symbols: they are counted, read aloud and searched differently from the letters they resemble.

The fancy text generator shows every alphabet side by side. This article is about where they come from.

One block, thirteen alphabets

Most styles come from the Mathematical Alphanumeric Symbols block, U+1D400 to U+1D7FF, added in Unicode 3.1. It holds thirteen styled Latin alphabets: bold, italic, bold italic, script, bold script, fraktur, bold fraktur, double-struck, sans-serif, sans-serif bold, sans-serif italic, sans-serif bold italic and monospace.

Each alphabet is 52 letters, capitals then lowercase, in the same order, so the block is a grid: take the start of an alphabet, add the letter's position, and you have the code point. Every generator is built on that arithmetic.

Digits are scarcer. Only five styles have them: bold, double-struck, sans-serif, sans-serif bold and monospace. There are no italic, script or fraktur digits anywhere in Unicode, which is why the numbers in a script or gothic name stay plain. That is not the generator failing; the characters do not exist.

The whole block sits above U+FFFF, in the range most software stores as two units per character, which is why a 23-character name fills 44 slots.

Why mathematics needed its own alphabets

In mathematical writing, style carries meaning. A bold x and an italic x are different variables, and a fraktur 𝔤 names something else again. Plain text had no way to keep them apart once formatting was stripped, so Unicode encoded the styles as characters in their own right.

That origin explains the shape of the block. Mathematicians use script and double-struck capitals constantly, so those alphabets are there in full. Nobody writes equations with script digits, so those were never added.

Twenty-four letters that live somewhere else

Some styled letters were in Unicode long before 2001. The Letterlike Symbols block, U+2100 to U+214F, has been part of the standard since 1993, and it already held the styled letters mathematics used most: ℝ for the real numbers, ℤ for the integers, ℂ for the complex numbers, ℋ for a Hamiltonian, ℒ for a Laplace transform, ℜ and ℑ for real and imaginary parts.

Unicode avoids encoding the same character twice. When the maths alphabets arrived, the slots where those letters would have gone were left permanently empty, and the code charts point to the older characters instead. The gaps are:

Italic: h, which is ℎ (U+210E, formally named PLANCK CONSTANT).

Script: B E F H I L M R and e g o, which are ℬ ℰ ℱ ℋ ℐ ℒ ℳ ℛ and ℯ ℊ ℴ.

Fraktur: C H I R Z, which are ℭ ℌ ℑ ℜ ℨ.

Double-struck: C H N P Q R Z, which are ℂ ℍ ℕ ℙ ℚ ℝ ℤ.

That is twenty-four letters across four alphabets. The other nine alphabets, including bold, sans-serif and monospace, have no gaps at all.

What a generator does with a gap

The arithmetic that makes generators simple is exactly what breaks at a gap. Add the position of B to the start of the script alphabet and you land on U+1D49D, a code point with no character assigned to it. No font on any device can draw it, because there is nothing to draw, so every reader sees a box.

That is a different failure from the usual one. A box normally means the reader's device has no font for a character that does exist, the problem covered in why fancy text shows as boxes. A reserved code point is a box on every platform, permanently.

The other common mistake is quieter: filling the gap with the nearest letter to hand. A script alphabet patched with italic letters turns Hello into 𝐻𝑒𝓁𝓁𝑜, three italic letters and two script ones. Nothing renders as a box, so it looks almost right, which is how it survives testing.

The correct fill is the Letterlike character, because that is the letter Unicode designates for the gap. Every style on this site fills the gaps that way, so the cursive generator writes ℋℯ𝓁𝓁ℴ, and the Old English and double-struck generators return complete alphabets.

The gaps change your character count

The gaps have a side effect that is easy to miss. The maths block sits above U+FFFF, so its letters take two units each in the UTF-16 encoding most apps use for text. Letterlike Symbols sit below it, at one unit each.

So a styled name does not cost a fixed two units per letter. ℋℯ𝓁𝓁ℴ is five letters and seven units: three gap letters at one unit and two script letters at two. The double-struck ℝ𝕆𝕄𝔸 is four letters and seven units.

This matters wherever a field counts units rather than letters, which many do. The same name can fit in one alphabet and not in another for a reason no preview shows, and a name with gap letters in it is shorter than the same name in bold.

Other styles come from other blocks

Not every style comes from the maths block. Bubble letters (ⓐ) come from Enclosed Alphanumerics, the negative squares (🅰) from its supplement, wide text (A) from the fullwidth forms made for East Asian typesetting, and small caps and tiny text are assembled from letters linguists use for phonetic transcription.

Those blocks have gaps of their own, and messier ones, because nobody designed them as alphabets. Small caps has no true X and borrows ǫ for Q; superscript has no q at all. Small caps, tiny text and wide text covers each one.

Normalisation folds most of it back

There is one place the difference between 𝐇 and H disappears on purpose. Unicode defines a compatibility normalisation called NFKC that maps styled letters back to plain ones: 𝐇, ℋ and ℍ all become H. Search engines and some platforms apply it, which is why styled text is findable in some places and invisible to search in others.

Many screen readers do not normalise and announce character names instead. What a screen reader hears covers what that sounds like, and it is the strongest reason to keep styled text out of anything someone needs to read rather than recognise.

Reading a result that looks wrong

The gaps are not a reason to avoid any style, but they explain most results that look slightly off.

If one letter of a script or gothic name looks a little different from its neighbours, it is probably a gap letter drawn from a different font on that device. That is correct behaviour and the price of those alphabets.

If a letter is a box on every device you try, suspect a reserved code point rather than a missing font, and try another generator's version of the style.

If a name is just over a limit that counts units, an alphabet with gap letters in it may bring it under.

And if the name has to be searchable, typeable or read aloud, keep the letters plain and put the style in a frame around them, as the case for frames in game names sets out.

Frequently asked questions

Why is one letter of my script name a box?

Either the device has no font for that character, or the generator produced a reserved code point where a gap letter belongs. If it is a box on every device, it is the second. The script gap letters are ℬ ℰ ℱ ℋ ℐ ℒ ℳ ℛ ℯ ℊ ℴ, and a correct generator uses those.

Why are there no italic or script numbers?

Unicode encodes styled digits in only five styles: bold, double-struck, sans-serif, sans-serif bold and monospace. In every other style the digits stay plain because there is nothing to map them to.

Is ℝ a different character from the rest of the double-struck alphabet?

Yes. ℝ is U+211D in Letterlike Symbols, in Unicode since 1993, while the rest of the double-struck alphabet arrived in the maths block in 2001. The maths block leaves the double-struck R slot empty and points to ℝ, so ℝ is the only double-struck R there is.