2011-04-09 88 views
10

給定一個特定的Unicode字符,比方說,我如何遍歷系統中安裝的所有字體並列出包含此字符的字形的字體?如何確定哪些字體包含特定字符?

+0

參見:[檢查不受支持的字符/字體中的字形(http://stackoverflow.com/questions/5025740/c-check-for-unsupported-characters-glyphs-in-a-font) – Ani 2011-04-09 11:57:24

+0

不是C#,但是這個python腳本效果很好:http://unix.stackexchange.com/a/268286/26952 – 2017-02-07 13:28:36

回答

12

我已經在.NET 4.0上測試過了,您需要添加對PresentationCore的引用以獲取字體&字體類型的工作。另請檢查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

非常感謝,這似乎工作得很好!當然,在生產代碼中,不會像這樣硬編碼字體文件夾。一個應該也可以採用'int'而不是'char'(或'string',然後使用'char.ConvertToUtf32'),否則你會限制它到BMP。再次感謝! – Timwi 2011-04-09 13:32:42

+3

對,它不是生產質量代碼,它更多**如何**。 – 2011-04-09 13:46:15

+0

在GDI +中,您可以通過創建一個'System.Drawing.InstalledFontCollection()'並循環訪問'.Families'屬性來輕鬆地查詢已安裝字體系列的列表(即不需要URI或文件夾位置,它只是以某種方式查詢Windows )。有沒有類似的方式來做到這一點與WPF PresentationCore的東西? – BrainSlugs83 2014-03-04 22:08:43

相關問題