Fancy Text: How Unicode Fonts Work and Where They Break
Why fancy text is characters and not fonts, which platforms accept it, what it costs a screen reader and a character limit, and the 24 letters Unicode never encoded.
Paste 𝐛𝐨𝐥𝐝 into an Instagram bio and it stays bold. Paste bold text copied out of Word into the same field and it lands flat. People hit this constantly and assume one of the two is broken. Neither is. One of them just isn’t formatting.
It’s characters, not fonts
A font is a set of drawings for characters you already have. Bold in Word means “draw this A with thicker strokes”, and the A underneath is still U+0041. The instruction to thicken it lives in the document, not in the letter, so stripping the document’s formatting gives you a plain A back.
𝐀 is a different animal. It’s U+1D400, MATHEMATICAL BOLD CAPITAL A, encoded as its own character in Unicode 3.1 back in 2001. The weight is baked into the identity of the character. A bio field can strip every scrap of formatting it likes and 𝐀 survives, because there is nothing to strip.
Unicode didn’t do this for Instagram. Mathematicians need to tell 𝐴 the scalar from 𝐀 the vector from 𝔸 the field, and those are three different objects, not one object in three typefaces. A typesetting instruction can’t carry that meaning through a plain-text channel, so the distinction had to go into the characters themselves. The Fancy Text Generator is an unintended use of a notation system built for algebra.
The 24 letters that trip up most generators
Here’s a quick way to tell a careful generator from a lazy one. Type “hi” and look at the italic.
A lazy generator adds a fixed offset to each letter. Italic lowercase a sits at U+1D44E, so italic h should be seven along at U+1D455. Except U+1D455 is permanently unassigned, and you get a box.
The reason is historical. By the time the maths block was drafted, some of those letters had already been encoded individually as named constants, and Unicode won’t encode the same character twice. Planck’s constant ℎ went in at U+210E. The Bernoulli script ℬ is U+212C. The Fraktur ℜ that mathematicians use for “real part of” is U+211C. Twenty-four slots in total were left as holes with a note pointing elsewhere:
- Italic: h
- Script: B, E, F, H, I, L, M, R, e, g, o
- Fraktur: C, H, I, R, Z
- Double-struck (outline): C, H, N, P, Q, R, Z
Type “Hello” in script into a few generators and watch what comes back. The ones that give you ℋℯ𝓁𝓁ℴ have the exception table. The ones that give you a box followed by three letters don’t.
Which fields accept it
The rule is more consistent than the folklore suggests. Platforms allow styled characters wherever a human reads the field, and block them wherever a machine parses it.
Discord takes fancy text in your display name and in a server nickname, and refuses it in your account username. Instagram takes it in the name field and the bio, never in the @handle. Twitter/X, YouTube and Telegram all draw the same line. An identifier gets validated against a character whitelist; a display name is decoration and passes straight through.
If a profile form silently refuses to save and shows no error at all, styled characters are the first thing to rule out.
What it costs
Two things, and neither is visible in the result.
Screen readers handle it badly. VoiceOver and NVDA read 𝐇𝐞𝐥𝐥𝐨 as maths symbols, spell it letter by letter, or skip it. That isn’t a bug: those code points genuinely mean “mathematical bold capital H”, and the reader is being accurate about what you wrote. Search engines apply the same logic, which is why a styled keyword in a YouTube title is a keyword you’ve thrown away. One decorative line is fine. A paragraph is not.
Character limits are the other one. Most styled letters live above U+FFFF, so each takes two UTF-16 units instead of one. Instagram counts code points and sees 𝐀 as a single character, but plenty of form validators count UTF-16 units and will insist your 90-character bio is 180. Combining decorations are worse again: a strikethrough welds an extra character onto every letter, so striking a 30-character line costs 60. The generator prints a code-point count next to each style, which is the number worth checking before you paste.
Cyrillic, Greek, and the rest
There is no bold Cyrillic in Unicode. No circled Arabic, no script Hebrew. The maths block covers Latin and a slice of Greek, and that’s the whole inventory — most of the world’s scripts have no styled twin at all, and no generator can invent one.
Two things do work on any script, because they’re marks rather than replacement letters: the combining decorations (strikethrough, underline, overline) and the ornamental wrappers. п̶р̶и̶в̶е̶т̶ comes out fine. 𝐩𝐫𝐢𝐯𝐞𝐭 has to be transliterated first, which is usually not what anyone wanted.
Pick a style, check the count, paste: the Fancy Text Generator runs entirely in your browser, twenty-three styles with a copy button on each.