2011-04-09 11 views
10

Dado un carácter Unicode específico, digamos 嗎, ¿cómo iterar sobre todas las fuentes instaladas en el sistema y enumerar las que contienen un glifo para este carácter?¿Cómo determinar qué fuentes contienen un carácter específico?

+0

Ver: [Compruebe si hay caracteres no admitidos/glifos en una fuente] (http://stackoverflow.com/questions/5025740/c-check-for-unsupported-characters-glyphs-in-a-font) – Ani

+0

No C#, pero esta secuencia de comandos python funciona muy bien: http://unix.stackexchange.com/a/268286/26952 –

Respuesta

12

He probado esto en .NET 4.0, necesita agregar referencia a PresentationCore para obtener la fuente & tipo de letra para que funcione. También marque Fonts.GetFontFamilies overloads.

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Windows.Markup; 
using System.Windows.Media; 

class Program 
{ 
    public static void Main(String[] args) 
    { 
     PrintFamiliesSupprotingChar('a'); 
     Console.ReadLine(); 
     PrintFamiliesSupprotingChar('â'); 
     Console.ReadLine(); 
     PrintFamiliesSupprotingChar('嗎'); 
     Console.ReadLine(); 
    } 

    private static void PrintFamiliesSupprotingChar(char characterToCheck) 
    { 
     int count = 0; 
     ICollection<FontFamily> fontFamilies = Fonts.GetFontFamilies(@"C:\Windows\Fonts\"); 
     ushort glyphIndex; 
     int unicodeValue = Convert.ToUInt16(characterToCheck); 
     GlyphTypeface glyph; 
     string familyName; 

     foreach (FontFamily family in fontFamilies) 
     { 
      var typefaces = family.GetTypefaces(); 
      foreach (Typeface typeface in typefaces) 
      { 
       typeface.TryGetGlyphTypeface(out glyph); 
       if (glyph != null && glyph.CharacterToGlyphMap.TryGetValue(unicodeValue, out glyphIndex)) 
       { 
        family.FamilyNames.TryGetValue(XmlLanguage.GetLanguage("en-us"), out familyName); 
        Console.WriteLine(familyName + " Supports "); 
        count++; 
        break; 
       } 
      } 
     } 
     Console.WriteLine(); 
     Console.WriteLine("Total {0} fonts support {1}", count, characterToCheck); 
    } 
} 
+0

Muchas gracias, parece que funciona bien! Por supuesto, en el código de producción uno no codificaría la carpeta de fuentes de esa manera. Uno probablemente también debería tomar un 'int' en lugar de un' char' (o un 'string' y luego usar' char.ConvertToUtf32') ya que de lo contrario lo estás limitando al BMP. ¡Gracias de nuevo! – Timwi

+3

Derecho, no es código de calidad de producción, es más de ** howto **. –

+0

En GDI + podría consultar fácilmente la lista de familias de fuentes instaladas creando un 'nuevo System.Drawing.InstalledFontCollection()' y recorriendo la propiedad '.Families' (es decir, no era necesaria ninguna ubicación de URI o de carpeta, solo consultó a Windows de alguna manera) ¿Hay alguna manera similar de hacer esto con las cosas de WPF PresentationCore? – BrainSlugs83

Cuestiones relacionadas