Find a font that can render your text

Paste the text you need to set. Every font is checked against every character in it, so you find out now rather than when the layout fills with empty boxes. Your fonts are read on this device and are not uploaded.

How it works

A font does not contain every character. It contains the ones it was drawn for, and nothing else. That is why a price in rupees turns into an empty box, why a colleague’s name loses its accent, and why a Hindi or Arabic line in a European font comes out as a row of rectangles. Designers call those boxes tofu, and they are the single most common way a layout breaks after it leaves the person who made it.

Every font file carries a table that answers this exactly. It is called the cmap, and it maps each character to the drawing the font holds for it. This tool reads that table. Your text is split into the distinct characters it actually needs, each font is asked about each one, and what comes back is a list you can act on: the fonts that have everything, and the fonts that are missing something along with what they are missing.

The alternative, which most such tools use, is to draw the character twice and compare the pictures. It is wrong often enough to be useless. Two fonts can draw the same letter identically, a browser quietly substitutes a different font when one is missing, and a missing character does not reliably come out as the box you would recognise. Reading the table is not a better guess. It is the answer the renderer itself uses.

None of it is uploaded. Reading the coverage of a font needs a few hundred bytes from the front of the file, so the file itself never has to move: your installed fonts are read where they sit, and a font file you add is opened in this tab. That matters more than it sounds like it should, because the font you are testing is often one you have licensed and are not allowed to redistribute, and sending it to a server to be inspected is redistributing it.

How to use it

  1. 1 Paste the text you need to set, in whatever languages and symbols it really uses.
  2. 2 Press Check my installed fonts, and allow the permission your browser asks for.
  3. 3 Add any font files you are considering, if they are not installed yet.
  4. 4 Read the two lists: the fonts that render everything, and the ones that are missing a character, with your text set in each so you can see it.

Good to know

  • Test the real string, not a sample of it. The character that breaks is almost always the one nobody thought to type: a rupee sign, a curly apostrophe, a dash, a name with a diacritic.
  • A font that covers your text is not the same as a font that shapes it well. Devanagari, Arabic and Khmer need the right conjuncts and joining behaviour as well as the right characters, and coverage cannot tell you whether they are there.
  • Emoji almost never live in a text font. If your text has one, expect every serious typeface to be missing it and the system emoji font to supply it. That is normal, and not a font you have to replace.
  • Font families split across files. Regular may have the character and Bold may not, so check the weights you actually intend to use rather than the family name.
  • A font that fails by one character is often the right answer anyway. Licence the family, and set the one missing glyph from a fallback: that is what a font stack is for.

Browser support

  • Chrome 94 and later · full speed from 103
  • Firefox 93 and later · slower path
  • Safari 16.4 and later · slower path
  • Edge 94 and later · full speed from 103

Best in Chrome or Edge.

These are the oldest versions with everything the tool uses. They are worked out from the tool itself, so they change when it does.

Version numbers checked on 2026-09-04.

The table inside a font that decides whether your text appears at all

Every font file carries a lookup table called the cmap, and it is the thing that answers the only question that matters here: given this character, which drawing does this font hold for it? A renderer consults it before anything else. If the answer is glyph zero, the font has nothing, and you get the empty rectangle that designers call tofu, or a substitute quietly pulled from some other font on the machine. This tool reads the same table the renderer reads, which is why its answer is not an estimate.

The alternative approach, which most font checkers use, is to draw the character on a canvas in the font under test, draw it again in a fallback, and compare the pixels. It fails in three separate ways. Two fonts can draw a letter identically, so a real glyph looks like a miss. The browser substitutes a different font when one is missing, so a miss looks like a hit. And on a page with a font stack you are measuring whichever font actually won, not the one you asked about. A lookup is not a better guess than a measurement. It is a different kind of thing.

Reading it correctly takes some care, because a cmap is several formats in one table and the useful ones are old. Format 4 covers the Basic Multilingual Plane through sorted segments, each mapping a range of characters either by adding a fixed delta or by pointing into a shared array of glyph ids, using a byte offset measured from the pointer’s own position: an addressing trick from an era when the table was memory-mapped rather than parsed. Format 12 is the flat one that reaches past the BMP, where the emoji and the rarer scripts live. A font that has both carries the wider one as a superset, so that is the one to read.

The trap in both is glyph zero. A segment can span a range of characters and still map some of them to nothing, and a reader that trusts the segment boundaries will report coverage the font does not have. That is a false positive on the exact question being asked, so every format here is evaluated down to the individual glyph id rather than to the range that contains it. Symbol fonts need naming too. Wingdings and its relatives hold no letters at all: they map the keyboard into a private-use block at U+F000 and draw a picture for each key, which makes them look like a perfect match for ordinary text. Where a font is doing that, the result says so.

None of this needs the font file. A table directory sits in the first few hundred bytes and gives the offset and length of every table in the file, so the coverage of a twenty megabyte CJK font can be read with two short range requests against the file on disk. That is what makes scanning a few hundred installed fonts possible in a browser tab instead of an exercise in exhausting memory, and it is why nothing has to be uploaded: the bytes that answer the question are small, and they never have to leave the machine they are already on.

One last thing is subtracted before any font is asked anything. Real text is full of characters that are never drawn: the zero-width joiners that hold an emoji family together, the variation selector that makes a heart red, the direction marks around an Arabic phrase, the byte-order mark an editor left at the front of the file. A font renders all of that correctly while owning a glyph for none of it. Counting them would report every font on the machine as failing, so they are filtered out first, and what remains is the set of characters a font is genuinely responsible for.

Frequently asked questions

Why does my text show empty boxes or question marks?

Because the font being used has no drawing for those characters. The browser or the application falls back to something else where it can, and where it cannot you get the empty rectangle that designers call tofu. Paste the text here and you will see which of your fonts are missing it and which are not.

Are my fonts uploaded anywhere?

No. Reading a font’s coverage takes a few hundred bytes from the front of the file, and that read happens in this browser tab on your own device. Open your developer tools, watch the Network tab, and run a scan: no request carries your fonts or their names. This matters for licensed fonts in particular, which you are usually not permitted to send to anyone.

Why can this page not see my installed fonts?

The Local Font Access API is only in Chrome and Edge on a computer, and it needs your permission because a list of installed fonts is a strong way to identify a device. Where the API is missing the page says so instead of pretending, and adding font files by hand works in every browser.

Can I check a font before I buy it?

Yes, and it is one of the better reasons to use this. A trial or a specimen file dropped in here tells you whether the family covers the languages and symbols your project needs, before you pay for a licence and discover the rupee sign is missing.

Why is WOFF2 not supported?

A WOFF2 is compressed with Brotli, and browsers do not expose a Brotli decompressor to scripts, only gzip and deflate. Shipping a decompressor would mean a large download for every visitor to save a format that always has a TTF or OTF twin. Use that twin. WOFF, which uses ordinary deflate, is read normally.

Does a font covering my text mean it will look right?

It means nothing will be missing, which is a floor rather than a guarantee. Complex scripts also need shaping: the conjuncts of Devanagari, the joining forms of Arabic, the stacking of Khmer. A font can hold every character and still set them badly. Coverage is the question this tool answers, and it is the question that decides whether the text appears at all.

What does the symbol font warning mean?

Fonts like Wingdings carry no real letters. They map the keyboard into a private area of Unicode and draw a picture for each key, so they appear to cover ordinary text while rendering it as arrows and boxes. Where that is what a font is doing, it is labelled, because otherwise it would look like a perfect match.

What counts as a character here?

A Unicode code point, counted once however often it appears. Emoji built out of several code points joined together are counted as their parts, because that is what a font needs to hold. The joiners themselves, along with line breaks and the invisible marks that steer direction and shaping, are left out: they are never drawn, so no font is at fault for lacking them.

Related tools

Your files are processed on your device and are not uploaded. You can verify this in your browser’s developer tools under the Network tab.