Missing glyphs trigger fallback and shift the layout
Aliases: missing glyph · tofu · cmap coverage
What it is
The chosen face does not contain a character — a rare name 「喆」, bopomofo, the euro, an emoji, a minority script — so rendering goes looking in the next face. That hunt is fallback. The replacement comes from another metric: different width, different face height, unmatched weight, so one or two glyphs rewrite the rhythm of the line and sometimes the wrapping of the whole paragraph. If no face in the chain has the character, a tofu block or a blank remains.
Fallback while a webfont is still loading, or after it fails, is another group. This is: the face you picked does not have that character in its cmap at all. Choosing a typeface is choosing coverage, not only choosing a look.
Why it happens
A line is a sum of glyph widths. A fallback glyph wider than the original shoves everything after it right, may add a wrap, and the card grows a slice; narrower, and a hole opens at the end of the line. If the vertical metrics disagree, that one character also jumps in the line, like a patch. Readers will not say “missing glyph.” They will say “one character in this line suddenly went fat / thin / into another font.”
The order of the fallback chain is the system’s. The same string may land in entirely different companion faces on iOS and Android, and the brand voice breaks at those one or two spots. Chinese is especially easy to trip on names, places, archaic characters, and bracket variants: UI faces drop extension blocks to save weight, and body copy jumps the moment they appear. Latin products entering a Chinese market often force an English face onto Han; almost every Chinese character then fallbacks, which means body type was never really chosen for Chinese — it merely displayed for now.
Coverage is not as coarse as “has Chinese.” The question is the character sets the product will meet — basic Han, Extension A, bopomofo, pinyin tone marks, currency, units, odd ligatures — and which of those blocks is missing from the package. Missing a block means that block’s setting no longer belongs to the face you chose.
Where it stops holding
User-generated text cannot be capped in advance, so fallback is the norm there; the goal becomes “the chain is a pairing you picked,” not a fantasy of zero fallback. Code points, scientific symbols, and music notation often live in specialist faces; falling back on purpose is design. Brand titles, navigation, and buttons — short, controllable strings — cannot miss: a metric jump there changes the component width directly. Flicker and jump during font load are a loading strategy; missing-glyph fallback still happens after the font has loaded. They are not one bug.
Applying it
- Run coverage against real product copy (names, places, currency, units, mixed Chinese–English) on the target face, and list code points that fall into the chain.
- Pick a face with enough coverage for controllable UI strings; for user input, prepare a fallback chain with nearby metrics, rather than letting the system splice at random.
- Do not pretend a Latin face can set Chinese body. Chinese needs a family that was actually chosen; fallback handles holes, not the whole passage.
- Circle fallback hits on screen. If width, weight, baseline, or flanks in the circle are visibly another face, that spot’s setting no longer belongs to the chosen type. User-generated content may keep the circles; titles and buttons may not.