Generator Grove

Why styled text breaks screen readers

Every “font changer” on the internet, this site's included, does the same thing: it swaps your letters for different Unicode characters that happen to look like letters. That is why the result survives a copy-paste into a bio that has no font settings — and it is also why part of your audience stops being able to read it.

These are not fonts, and the distinction is the whole problem

A font is a set of drawings for characters you already have. Styled text is the opposite: the characters change and the drawing stays whatever your device decides. The a in a cursive generator's output is not a styled a. It is U+1D4EA, whose formal Unicode name is MATHEMATICAL SCRIPT SMALL A. It lives in the Mathematical Alphanumeric Symbols block, which exists so that a physicist can write a script a and an italic a in the same equation and mean two different quantities by them.

Bubble letters come from Enclosed Alphanumerics and its Supplement — blocks built for circled numbers in diagrams. Glitch text is ordinary letters with combining diacritical marks stacked on top, dozens per letter, using a mechanism designed to put one accent on one vowel. In every case the tool is borrowing symbols from a system that means something else by them.

Software that only draws text never notices. Software that has to say text notices immediately.

What a screen reader actually does with it

A screen reader turns characters into speech using a pronunciation dictionary. Give it a character the dictionary does not cover and it has three fallbacks, and which one you get depends on the reader, its version, and the language it is set to:

None of these is a bug to be fixed in a later release. The reader is describing the characters accurately; the characters are simply not the ones you meant. No setting in any generator changes this, because the output is the problem.

Braille displays are worse rather than better. A braille display maps characters to cell patterns one at a time, and characters outside its table come out as a fallback pattern or as nothing — so a styled word arrives as noise with no indication that it was ever a word.

Three other things that break, which people notice sooner

Search stops matching

A search index stores what the characters are, not what they resemble. A profile named with script characters is not findable by typing the plain-letter version of that name, on the platform's own search or on Google. If you want to be found by your name, your name has to be in letters.

Some platforms quietly undo it

Unicode defines a normalisation form, NFKC, that maps compatibility characters back to their plain equivalents — and Mathematical Alphanumeric Symbols are exactly the kind of character it collapses. A platform that runs NFKC on input turns your styled name back into ordinary letters on save. A platform that does not, keeps it. That is why the same trick works on one site and vanishes on another, and why testing on the specific service matters more than any general advice. The behaviour is specified in Unicode Standard Annex #15.

Character limits count differently than you do

Bubble capitals, mathematical script and most of the decorative blocks sit above U+FFFF, which means each one costs two UTF-16 code units rather than one. A field that advertises a 20-character limit and counts code units will take ten styled letters. The counter is not broken; you are spending twice per character.

Where it is still fine

This is not an argument for never using it. It is an argument for knowing which text on a page is load-bearing.

Fine: decoration around content that also exists in plain letters. A divider. A flourish in a post whose actual message is written normally. A one-off graphic effect where nothing depends on the words being read.

Not fine: your display name, a link label, a button, an instruction, a price, a date, a call to action, or anything someone has to act on. If a listener who hears “mathematical script small s, mathematical script small a” instead of your name has lost something, that text should be plain.

The reliable pattern when you want both is to keep a plain version adjacent — a styled header with the same words in normal letters directly underneath costs you one line and keeps the meaning available to everyone.

What to use instead, when you control the page

If the text is on a site you build, none of this applies to you and you should not be using look-alike characters at all. Set a real typeface in CSS with font-family, and load it with @font-face if it is not a system face. The characters stay ordinary letters — searchable, selectable, speakable — and only their drawing changes. That is what fonts are for.

Unicode styling is for the places that give you a text box and no formatting: social bios, display names, chat, comment fields. It is a workaround for someone else's missing feature, and it carries the cost described above every time you use it.

The tools on this site that this applies to

Four generators here produce Unicode-styled text, and each page documents what its own output does to glyph coverage and character counts: cursive text, the font generator, bubble text and glitch text. The accessibility cost is the same for all four, which is why it is written down once, here, rather than four times.

Last updated