DEV Community

Gia Hao Truong
Gia Hao Truong

Posted on Fully Autonomous

Will these fancy Unicode letters show as boxes? I checked 62 styles and 889 symbols against Windows 10 and Android fonts

"Fancy text" generators turn hello into 𝒽ℯ𝓁𝓁ℴ or β“—β“”β“›β“›β“ž by swapping each letter for a different Unicode character. The question users actually care about is simple: will my friend see the letters, or a row of empty boxes (tofu)?

I run a small generator of this kind, cutefonts.art (disclosure: it's my project), and I wanted a real answer instead of the usual "works on most devices". So I measured every style and every symbol the site offers against the fonts that Windows 10 and several Android releases actually ship. Here is how, what came out, and what surprised me.

What was measured

  • 62 text styles (script, bold, bubble, small caps, upside down, strikethrough, glitch and so on)
  • 889 symbol entries in 12 groups (hearts, stars, bows, flowers, arrows, frames, Japanese and Korean decorations, dividers...)
  • Windows 10 (22H2): 139 stock font files from the Windows font folder, Office and third-party fonts left out
  • Android 8, 10, 12, 14 and the main branch: every font file named in Android's own fonts.xml at android-8.0.0_r1, android-10.0.0_r1, android-12.0.0_r1, android-14.0.0_r1 and main, downloaded from android.googlesource.com
  • iPhone, iPad and Mac were not measured (I had no clean way to get the shipped font set), so nothing below says anything about Apple devices

How: read the cmap of every font file

A character "exists" on a platform if at least one of its system fonts has a glyph for it. That is what a browser with normal font fallback will find. With fontTools this is a lookup in each font's character map:

from fontTools.ttLib import TTFont, TTCollection


def open_fonts(path):
    if path.lower().endswith(".ttc"):
        return list(TTCollection(path).fonts)
    return [TTFont(path, lazy=True)]


def load(paths):
    out = []
    for p in paths:
        for f in open_fonts(p):
            out.append((f, f.getBestCmap() or {}))
    return out


def has_glyph(fonts, cp):
    for f, cmap in fonts:
        name = cmap.get(cp)
        if name is None:
            continue
        if "glyf" in f and not chr(cp).isspace():
            if f["glyf"][name].numberOfContours == 0:
                continue
        return True
    return False
Enter fullscreen mode Exit fullscreen mode

The numberOfContours == 0 check matters: some fonts map a code point to an empty outline, which renders as nothing, and that should not count as "found". Spaces are the exception because they are supposed to be empty.

Run every character of every style and symbol through has_glyph for each platform's font list and you get a coverage table.

Result 1: the letters themselves are fine

All 62 styles had every glyph present on Windows 10 and on Android 8 through latest. The Mathematical Alphanumeric Symbols block (where most "fonts" come from) has been in system fonts for years.

So why do people still see broken fancy text? Not because of missing glyphs, but because of two other things:

  1. Emoji presentation. Some letters are also emoji. β“‚ and the squared πŸ…° πŸ…± πŸ…Ύ πŸ…Ώ turn into colour emoji in many apps, so one letter in the word suddenly looks different. The "letter tiles" style uses Regional Indicator Symbols: put two of them next to each other and the system draws a country flag (πŸ‡Ί + πŸ‡Έ = πŸ‡ΊπŸ‡Έ). That style needs an invisible separator between letters, or words turn into flags.
  2. Combining marks. Strikethrough, underline, slashed and glitch text add a combining character after each letter. Every mark counts as a character, so a 20-letter name can blow through a 32-character username limit, and the stacking looks different in every app.

That gave 48 styles "safe", 12 "mostly safe" (combining marks or emoji-prone letters) and 2 "may show boxes" (styles built from emoji).

Result 2: symbols are where boxes come from

For the 889 symbol entries, all glyphs were found for:

Platform Entries fully found
Windows 10 875 of 889
Android 8 876 of 889
Android 10 880 of 889
Android 12 880 of 889
Android latest 886 of 889

19 entries lack a glyph somewhere. They fall into three clear groups:

  • New emoji. Pink Heart (U+1FA77), Light Blue Heart (U+1FA75), Heart Hands (U+1FAF6), Lotus (U+1FAB7) and Hand With Index Finger And Thumb Crossed (U+1FAF0) are missing on Windows 10 and on Android up to 12. They are popular in "aesthetic" bios right now, which is exactly why they cause trouble.
  • Letters from rare scripts used as decoration. Cham Letter Ai (U+AA04), Balinese Musical Symbol Dong (U+1B61), Lepcha Letter Bla (U+1C14) and Batak Symbol Bindu Pinarboras (U+1BFD) look like tiny hearts, bows or flowers, and copy-paste sites love them. Android ships Noto fonts for these scripts; stock Windows 10 does not.
  • Power Sleep Symbol (U+23FE). Missing on every platform measured. It still circulates in "moon" symbol lists.

One caveat about the denominator: some symbols were only added to the site's lists after checking that Android 8 and Windows 10 had them, so the miss rate here is lower than for a random pick of Unicode.

If you build a generator like this

  • Check glyph coverage at build time, not by eyeballing on your own phone. A cmap lookup over the target platforms' font lists is cheap and catches the rare-script "hearts" immediately.
  • Count length in grapheme clusters, not code units, when you show "characters left" for a bio or username: [...new Intl.Segmenter().segment(text)].length in JavaScript. Then show the platform's own count rule next to it, because platforms differ.
  • Treat emoji-capable letters separately. Anything that can render as emoji will look different from its neighbours on most phones.
  • Separate regional indicator letters with an invisible character if you want letters, not flags.

Limits

This is a font-file test, not a rendering test on real devices. It assumes an app falls back to other fonts like a browser does; an app with its own bundled font can show boxes even when the system has the glyph. Apple platforms are not covered.

The data

The full tables (every style, every symbol group and the 19 missing entries by code point) are on the Unicode font compatibility data page, with three CSV files under CC BY 4.0 if you want to reuse them. If you have a clean way to read the shipped font list of current iOS, I would love to add that column.

Top comments (0)