diff --git a/gfx/thebes/src/gfxOS2Fonts.cpp b/gfx/thebes/src/gfxOS2Fonts.cpp
--- a/gfx/thebes/src/gfxOS2Fonts.cpp
+++ b/gfx/thebes/src/gfxOS2Fonts.cpp
@@ -168,12 +168,24 @@
         return *mMetrics;
     }
     if (!face->charmap) {
-        // Also abort, if the charmap isn't loaded; then the char
-        // lookups won't work. This happens for fonts without Unicode
-        // charmap.
-        cairo_ft_scaled_font_unlock_face(CairoScaledFont());
-        FillMetricsDefaults(mMetrics);
-        return *mMetrics;
+#ifdef DEBUG_thebes_1
+        printf("gfxOS2Font[%#x]::GetMetrics(): non-unicode charmap\n",
+               (unsigned)this);
+#endif
+        // FT loads the unicode charmap (FT_ENCODING_UNICODE) by default.
+        // If one doesn't exist, it has to be of another encoding. Try to
+        // load what's available.
+        FT_Error error = -1;
+        int n = -1;
+        while (error && ++n < face->num_charmaps) {
+            error = FT_Set_Charmap(face, face->charmaps[n]);
+        }
+        if (error) {
+            // Abort, if the charmap isn't loaded; the char lookups won't work.
+            cairo_ft_scaled_font_unlock_face(CairoScaledFont());
+            FillMetricsDefaults(mMetrics);
+            return *mMetrics;
+        }
     }
 
     // compute font scaling factors
@@ -743,7 +755,9 @@
                     }
 #endif
                 }
-                if (!face || !face->charmap) { // don't try to use fonts with non-Unicode charmaps
+                // Don't try to use fonts with broken charmaps; usable ones
+                // should have been loaded by GetMetrics.
+                if (!face || !face->charmap) {
                     if (face && face != face0)
                         cairo_ft_scaled_font_unlock_face(font->CairoScaledFont());
                     continue; // next font
