
Web font formats and subsetting: WOFF2 done properly
What really separates TTF, OTF and WOFF2, why subsetting saves the most, and how a Latin-only subset silently breaks Turkish text on a live page.

The decorative letters you paste into a name field do not come from an installed typeface. They come from the mathematical, fullwidth and enclosed alphabet blocks, and that decides where they work and where they quietly break.
Search for an "Adopt Me font" or a "Roblox font" and you land on a page of boxes with copy buttons. Whatever comes out of those boxes is not a typeface that gets installed anywhere. Unicode encodes characters, not glyphs: how a letter is drawn belongs to the font, but which letter it is lives in the code point stored in the file. Those decorative letters are not styled versions of the alphabet. They are different characters.
The practical consequence is simple. You cannot install a font into someone else's game. Adopt Me and Roblox render their interface with their own typeface and never look at what is installed on your machine. What you type into a name field travels to the server as a sequence of characters, so the only available mechanism for "changing the font" in a name is substituting characters that happen to look like letters. The Unicode text styles tool does exactly that, and it does it in the browser from a lookup table, so the text you type is never sent anywhere.
Almost every style you will meet comes out of five blocks. Knowing the block is worth the effort, because the block largely determines where a style survives and where it falls apart.
| Block | Range | Look it produces |
|---|---|---|
| Mathematical Alphanumeric Symbols | U+1D400–U+1D7FF | Bold, italic, script, fraktur, double-struck, sans, monospace |
| Halfwidth and Fullwidth Forms | U+FF00–U+FFEF | A B C: the wide-spaced vaporwave look |
| Enclosed Alphanumerics | U+2460–U+24FF | Ⓐ ⓐ ①: circled letters and digits |
| Enclosed Alphanumeric Supplement | U+1F100–U+1F1FF | 🄰 🅐: squared and filled-circle letters |
| Phonetic Extensions | U+1D00–U+1D7F | ᴀ ʙ ᴄ: small capitals |
Underlined, struck-through and zalgo styles work differently. They keep the ordinary letter and append a combining mark from U+0300–U+036F, so the letter really is the letter with something stacked on it. That is why an underlined name doubles in character count. If you want to inspect an individual code point, the Unicode symbol browser lists the block and encoding for each one.

Four quick tests settle it every time.
None of these blocks is a complete alphabet. Where a character is missing the converter passes it through untouched, so the name comes out half styled and nothing tells you why.
The rule is easier to read backwards: the more exotic a style looks, the more gaps its alphabet has. The bold sans set covers all 26 uppercase, 26 lowercase and 10 digits. The italic sets carry no digits of their own, because Unicode never encoded italic digits at all, and the decorative sets have far wider gaps.
The same string does not behave the same way in every field. Username fields are usually validated against a narrow allowlist, while display name fields tend to be permissive. When a style is rejected, the problem is the field's validation rule rather than the style itself.
| Field | What to expect |
|---|---|
| In-game username | Usually rejected; sign-up fields keep the character list short |
| Display name, pet name, trade note | Usually works, though filters can still catch it |
| Chat and status text | Works, unless moderation filtering is aggressive |
| Instagram and Discord bios | Works, and this is the safest place to use it |
| Documents, email, form fields | Displays, but breaks search, sorting and autocomplete |
To see which styles survive on a given platform, the sets on the Adopt Me name studio, Roblox text styles, Discord and Instagram are already trimmed to that field's character budget. Even so, the only reliable check is trying to save the name for real.
The official character names decide this one. U+1D5D4 is called MATHEMATICAL SANS-SERIF BOLD CAPITAL A. It is not a bold A. It is a separate symbol with its own identity, reserved for mathematical notation.
Screen readers speak text according to character identity. When a word cannot be recognised, the reader falls back to announcing characters one by one by name, or skips them. A name written in a mathematical alphabet therefore arrives as a run of symbol names, as repeated "unknown character" announcements or as nothing at all. A player using assistive technology cannot learn who you are. Combining-mark styles are worse still, because an extra mark follows every letter and the reading is shredded.
This is not a cosmetic complaint. The WCAG readability guideline expects text to be understandable to the machinery that presents it, and swapping letters for symbols attacks precisely that layer. The same substitution puts the name in the wrong place when a list is sorted, keeps it out of search results and removes it from autocomplete and mention lookups.
It also explains why platforms filter these characters in the first place. Profanity and harassment filters match ordinary letters, and the same word written in a mathematical alphabet slips straight past them. Many games and social networks therefore block the blocks outright in username fields.
NFKC, one of Unicode's normalisation forms, applies compatibility mapping: it folds mathematical alphabets, fullwidth forms and circled letters back to plain ASCII. On a system that normalises input that way, 𝗔𝗕𝗖 is silently stored as ABC. The save succeeds, the styling is gone and nothing explains where it went. When a name works on one service and comes out plain on another, this is usually the reason.
Treating these as two separate jobs makes the decision easy. For thumbnails, banners and channel art you use a genuine font: load a .ttf or .otf you are licensed for into a graphics program and you get the weight and kerning you actually wanted. Nothing about Unicode matters there, because the output is a picture.
For names, bios and chat, Unicode is the only mechanism available, so the work goes into choosing well. Pick a set with a complete alphabet, check that your digits and accented letters survived before you copy, and keep the decoration down to a character or two. For separators and frames an emoji is usually the safer choice, because emoji are rarely filtered and they carry a real spoken name for assistive technology. The emoji picker copies the character along with its code point.
The game uses a typeface in its own interface, but you cannot apply it to a name field. Whatever you type goes to the server as characters, and the game never looks at fonts installed on your device. What people call an Adopt Me font is a set of Unicode characters drawn from the mathematical and enclosed alphabet blocks.
The block you picked is not a complete alphabet. Accented letters such as ç, ğ, ö, ş and ü appear in none of these blocks; the squared and filled-circle sets have no digits; small capitals have no x; subscripts are missing nine letters. Anything unmapped passes through untouched, leaving the name half styled.
Username fields are validated against a narrow character allowlist that these blocks are not on. They are also treated as filter evasion, because profanity filters match ordinary letters and the same word written in a mathematical alphabet slips past. Display names, pet names and status text are usually more permissive.
Mostly not. U+1D5D4 is named MATHEMATICAL SANS-SERIF BOLD CAPITAL A, so it is a separate symbol rather than the letter A. A screen reader will announce symbol names one by one, say unknown character, or skip the text. Styles built from combining marks break the reading completely.
Two reasons. If the device has no font covering that code point you get empty boxes. And if the service normalises input with NFKC, mathematical and fullwidth letters are folded back to plain ASCII automatically, so the save succeeds while the styling disappears.

What really separates TTF, OTF and WOFF2, why subsetting saves the most, and how a Latin-only subset silently breaks Turkish text on a live page.