How the Fancy Text Generator Works
After reading this you will understand what "fancy text" actually is at the byte level: not a font, but a set of separate Unicode characters that happen to look like styled letters. You will know when to use it, when it will hurt you, and how each style is built.
Type Hello into the Fancy Text Generator and you can get back 𝓗𝓮𝓵𝓵𝓸, hello, or Hᴇʟʟᴏ. These look like a font change. They are not. Each one is a different sequence of Unicode codepoints that your device happens to draw in a decorative shape. The letter H is codepoint U+0048. The script 𝓗 is codepoint U+1D4D7, a completely separate character named MATHEMATICAL BOLD SCRIPT CAPITAL H. Your keyboard cannot type it, but a lookup table can produce it.
That distinction is the whole story. Understanding it tells you exactly why fancy text works in a Twitter bio but breaks a search box, and why a screen reader reads 𝓗𝓮𝓵𝓵𝓸 as a string of math symbols rather than the word "hello".
What the styles actually are
Unicode assigns a number to every character. As of Unicode 15.1 there are 149,813 assigned codepoints. Among them are several near-complete Latin alphabets that were added for specific reasons, mostly mathematics, and that the Fancy Text Generator borrows for decoration.
- Mathematical alphanumeric symbols
- The block
U+1D400toU+1D7FFholds bold, italic, script, fraktur, double-struck and monospace alphabets, added in Unicode 3.1 (2001) so that \mathbb{R} and a plainRcould be told apart in plain text. - Fullwidth forms
- The block
U+FF01toU+FF5Eholds wide versions of ASCII, built so Latin letters line up on the same grid as Chinese, Japanese and Korean characters. - Enclosed alphanumerics
- Bubble letters like
ⓗ(U+24D7) and square letters like🄷live here. They were designed for list markers and symbols, not decoration. - Small capitals and phonetic letters
- Small caps such as
ᴀ(U+1D00) come from the phonetics block. There is no small-caps letter for every position, so some fall back to the ordinary capital.
Upside-down text and zalgo are different in kind. Upside-down reuses unrelated characters that resemble rotated letters (a lowercase e becomes ǝ, U+01DD, a Latin turned e). Zalgo adds combining marks on top of normal letters, which we treat separately below.
When to use it, and when not
Fancy text is fine in three places: a social media display name or bio, a one-line message where you want visual contrast, and a headline you will screenshot anyway. It is a poor choice almost everywhere else.
Do not put fancy text in anything that will be searched, sorted, or read aloud. A profile name of 𝓙𝓸𝓱𝓷 will not match a search for John, because the codepoints differ. A screen reader may announce eleven separate math symbols instead of one name.
The reason is mechanical. Search and sort compare codepoints. J is U+004A; 𝓙 is U+1D4D9. They are as unrelated to a computer as J and 7. Autocomplete, spell-check and accessibility tools all break on the same rock.
How the transformation works
Every non-zalgo style is a fixed offset lookup. Take a source letter, find its position in the alphabet, and add that position to the base codepoint of the target block.
Here C_{\text{in}} is the codepoint of the letter you typed, A is the codepoint of A or a in ASCII, B is the codepoint where the target alphabet's A or a begins, and C_{\text{out}} is the styled character. The term (C_{\text{in}} - A) is just the letter's index, 0 for A, 25 for Z.
For mathematical bold script the uppercase base is B = \texttt{0x1D4D0} (decimal 119,952) and lowercase base is 0x1D4EA (decimal 119,978). The rule is that clean because the Latin alphabet has 26 contiguous letters. It breaks only where Unicode left holes. In the math script block, five letters (B, E, F, H, L and a few lowercase) were already encoded elsewhere as "letterlike symbols", so those slots are reserved and the generator patches them in by hand.
Because each styled letter can sit outside the Basic Multilingual Plane, it is stored as a surrogate pair in UTF-16: two 16-bit code units per visible character. So 𝓗 counts as length 2 in JavaScript's String.length even though it is one character on screen.
A worked example on "Hello"
Converting H, e, l, l, o to bold script
HisU+0048, decimal 72. Its index is 72 - 65 = 7. Add to uppercase base: 119952 + 7 = 119959 = \texttt{U+1D4D7}, which renders as𝓗.eisU+0065, decimal 101. Index 101 - 97 = 4. Add to lowercase base: 119978 + 4 = 119982 = \texttt{U+1D4EE}, rendering𝓮.lisU+006C, decimal 108. Index 108 - 97 = 11. Result 119978 + 11 = 119989 = \texttt{U+1D4F5}, rendering𝓵. The secondlis identical.oisU+006F, decimal 111. Index 111 - 97 = 14. Result 119978 + 14 = 119992 = \texttt{U+1D4F8}, rendering𝓸.
The output 𝓗𝓮𝓵𝓵𝓸 shows 5 characters and reads as one word to your eye. To software it is 5 codepoints, and in UTF-16 it is 10 code units. In UTF-8 each of these characters takes 4 bytes, so the string is 20 bytes, against 5 bytes for plain Hello.
How zalgo is built
Zalgo is the odd one out. It does not swap letters. It keeps your normal text and stacks combining diacritical marks on top of and below each letter. Combining marks are codepoints in the ranges U+0300 to U+036F (above), plus below-baseline marks, that attach to the preceding character and have zero advance width. Add enough of them and the glyph smears into its neighbours.
The intensity slider on the tool controls how many marks are drawn per letter. A reasonable model: pick a count for each letter uniformly between 0 and the intensity value I, so the expected marks per letter is I/2.
Here n is the number of base letters and I is the intensity. For Hello with n = 5 and intensity I = 20, the expected total is 5 \cdot (1 + 10) = 55 codepoints for a word that shows 5 letters. That growth is why heavy zalgo can lag a text field or overflow a line above it.
Reading the output correctly
When you copy fancy text, judge it by three questions. Does the target field accept non-ASCII Unicode at all? Some username fields silently strip anything outside a narrow set. Does the target render the block? Fullwidth and math letters have wide font coverage; some square and enclosed letters do not, and show as a box. Will the text be read aloud? If yes, prefer plain text.
| Style | Unicode block | Screen reader | Font coverage |
|---|---|---|---|
| Bold, italic, script, fraktur | Math alphanumeric | Poor | Wide |
| Small caps | Phonetic + Latin | Fair | Wide |
| Fullwidth | Halfwidth/Fullwidth | Fair | Wide |
| Bubble, square | Enclosed alphanumerics | Poor | Patchy |
| Upside-down | Mixed lookalikes | Very poor | Patchy |
| Zalgo | Combining marks | Unreadable | Wide but messy |
Common mistakes
Three errors come up again and again.
- Using it in a name field you will later search. Once your display name is
𝓙𝓸𝓱𝓷, people typingJohnwill not find you. - Counting characters wrong. A bio limit of 160 counts codepoints or code units, not glyphs. Bold script "Hello" spends 5 codepoints but 10 UTF-16 units. On a platform that limits by code units, styled text eats your budget twice as fast.
- Overusing zalgo. Past intensity 15 or so the text starts colliding with the line above and may be truncated or rejected. Keep it low if the field is narrow.
Related tools
If you are filling a layout with dummy text before styling it, the Lorem Ipsum Generator gives you clean placeholder copy. If you took a fancy title and now need a plain, ASCII-only web address from it, the Slug Generator strips the decoration back down to lowercase letters and hyphens.
Frequently asked questions
Why does my fancy text sometimes show as empty boxes?
The box (called .notdef) means the device has no glyph for that codepoint. Enclosed and square letters have the patchiest coverage, so they fail most often on older phones. The characters are still correct; only the local font is missing.
Is fancy text a font I need to install?
No. Nothing is installed. Each style is a set of real Unicode characters that most fonts already draw. That is why it survives copy and paste between apps, and why you cannot toggle it off like a font.
Will fancy text hurt my accessibility?
Yes, if overused. Screen readers spell math and enclosed letters out character by character, and zalgo is effectively unreadable. Use it for short accents, never for information a reader must act on.
Does the styled text leave my device?
No. The conversion is a codepoint lookup that runs entirely in your browser. Nothing you type is uploaded.
Why is my styled string twice as long in a character counter?
Math alphabet letters sit above U+FFFF, so each is stored as two UTF-16 code units. A counter that measures code units reports double. A counter that measures visible characters reports the true letter count.