There are things that programs can do to deal with this, but unfortunately the work-arounds come at the expense of runtime performance and code complexity.<p>For example, a program could use a different font to pull in missing characters.  But this can take a lot of extra effort to render properly; if the typography system doesn't have the concept of font substitution (or even if it does), then your layout slows down while you figure out how to place the substitute glyphs.<p>Another option is reinterpretation: trying really hard to display an approximation of an unsupported character, instead of garbage (this could be done using the characters that are actually in the font, or it could be done by drawing manually).  The idea here is to make it as easy as possible for the user to read what was intended.  For instance, Unicode probably has a dozen characters that look like an ASCII minus-sign; it is kind of silly to ever display garbage for a character as simple as a horizontal line, as long as some line-like rendering is available.