Question

What happens if my font does not support a certain character? Do I have to design glyphs for as many characters as possible? 

Answer

Before the introduction of Unicode, text was typically encoded so that one byte represented one character. This allowed for 256 different characters to be represented. It soon became obvious that this is not sufficient, so an idea of codepages was born. Some information would be associated with the text that told the app which standardized set of 256 codes the text was using. In some apps, for example in Microsoft Word in versions before 97, text could use one codepage, and then switch to another codepage. But this mechanism was still inefficient and complicated. Unicode originally assigned 65,536 codes (so each character was represented by two bytes). Later the repretoire was extended, and Unicode can now potentially represent over 1 million characters. 

OpenType fonts have a data structure (table) called cmap (character mapping) that maps Unicode codepoints to glyphs. If a Unicode codepoint appears in the text but is not present in a font’s cmap table, one of two things happens: 

The traditional behavior was that the app would then render the 1st glyph of the font (with index 0). The glyph is typically named .notdef and often contains a bordered rectangle. 

The more modern behavior is that the app uses font fallback. This means that the app (or the operating system) picks another font that does contain a glyph for the requested character. As the font maker, you don’t have a way to influence which fallback font gets picked exactly. However, in Font Info > Other Values > PANOSE Identifier, you can describe your font using a set of predefined parameters. Some apps and systems (most notably Windows) will use the PANOSE Identifier to find the visually closest fallback font. If the font is used on a website, the font-family CSS property can describe a font stack, a series of font family names that the browser should use for fallback. Normally, the browser tries to use the first font to show all text, and if the font does not contain a glyph for a certain character, it tries to use the second font, and so on. An additional CSS descriptor unicode-range controls this more precisely: when the a @font-face definition of a web font contains unicode-range (which in fact can be a list of ranges, or of single codepoints), then the browser will only use the font to represent the Unicode characters from that range, even if the font’s cmap table covers more codepoints. It uses the subsequent fallback fonts for other ranges.

When font fallback is used, the glyphs that come from the fallback fonts do not interact in any way with the glyphs from the primary font. The app or system does simple positioning of the glyphs, which is usually just adding the advance width. Kerning, mark positioning etc. does not work across fonts.