2011-04-09 14 views
10

Belirli bir Unicode karakteri verildiğinde, 嗎 diyelim, sistemde yüklü olan tüm fontlar üzerinde nasıl yinelemeli ve bu karakter için bir glif içerenleri listeleyelim?Hangi yazı tiplerinin belirli bir karakter içerdiğini nasıl belirlenir?

+0

bakınız: [desteklenmeyen karakterler için kontrol/bir yazı tipi kabartmalar] (http://stackoverflow.com/questions/5025740/c-check-for-unsupported-characters-glyphs-in-a-font) – Ani

+0

Not C#, ancak bu python betiği harika çalışıyor: http://unix.stackexchange.com/a/268286/26952 –

cevap

12

Bunu .NET 4.0 üzerinde test ettim, çalışma için & yazı tipi türlerini almak için PresentationCore'a başvuru eklemeniz gerekir. Ayrıca Fonts.GetFontFamilies overloads'u da kontrol edin.

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

Çok teşekkürler, iyi çalışıyor gibi görünüyor! Tabii ki, üretim kodunda biri, font klasörünü bunun gibi kodlamayacaktı. Muhtemelen bir 'char' (veya 'string' yerine' int' yerine '' '' '' '' '' '' char.ConvertToUtf32'' yerine '' yerine bir '' ''' almalısınız, aksi halde BMP’ye sınırlandırmalısınız. Tekrar teşekkürler! – Timwi

+3

Doğru, üretim kalitesi kodu değil, daha fazlası ** howto **. –

+0

GDI + 'da yeni bir System.Drawing.InstalledFontCollection() 'oluşturarak ve' .Families' özelliği üzerinden döngü oluşturarak yüklü font ailelerinin listesini kolayca sorgulayabilirsiniz (örn. Hiçbir URI veya klasör konumu gerekli değil, yalnızca Windows'ta sorgulanır)). WPF PresentationCore şeyler ile bunu yapmak için benzer bir yolu var mı? – BrainSlugs83

İlgili konular