如何检测字体中定义的字符?

7

我正在制作一个简单的工具来帮助处理 CSS 图标字体。

目前,它采用一种指定的 wingdings 样式字体,并将其表示为每个 Unicode 编码下的外观,与标准系统字体(例如 Arial)并排显示。目前我使用的是 Unicode 编码 33-255。

对于熟悉字体和字符编码的人来说,许多位置都将为空。这里有一个示例:enter image description here

如您所见,实际上值得显示的字符在该字体中只占少数,而在此 Unicode 范围内的许多字符甚至不会出现在默认无衬线字体中。这不是关键问题,所有可用字符都已显示,但纯粹出于好奇,我想知道是否有一种方法可以告诉我们哪些字符在字体中被表示。有人知道解决方案吗?

理想情况下,首选服务器端解决方案,任何语言都可以。但是,任何解决方案都将是有价值的。

对于好奇的人,我的现有代码已经上传到 Github:Font Looper

我希望使用平面文件的方式不会太过冒犯任何人,我正在尽力保持简洁明了。


不错的想法。祝字体循环器好运。 抱歉我帮不上忙,但我喜欢它。 - Basic Bridge
1个回答

4
我相信你需要的信息在字体的CMAP表中。虽然我不是字体方面的专家,但我的理解是CMAP表将Unicode点映射到字形索引。因此,如果没有将一个Unicode点映射到字形,则可以假定该字体不支持该字符。
以下是使用WPF媒体库发现的一些C#示例代码:
var fontFamilies = System.Windows.Media.Fonts.GetFontFamilies(@"C:\Windows\Fonts\Arial.ttf");

foreach (var family in fontFamilies)
{
    foreach (var typeface in family.GetTypefaces())
    {
        var glyph = null as System.Windows.Media.GlyphTypeface;

        if (typeface.TryGetGlyphTypeface(out glyph))
        {
            foreach (var kvp in glyph.CharacterToGlyphMap)
            {
                Console.WriteLine(kvp.Key.ToString() + " : " + kvp.Value.ToString());
            }
        }
    }
}

不知道这对您有多大帮助,但您确实说过任何语言/解决方案都会很有价值。

所有这些类都可以在PresentationCore.dll程序集的一部分的System.Windows.Media命名空间中找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接