是否可以确定字体的字符集?

时间:2017-11-28 15:45:16

标签: c# .net character-encoding

我正在打印使用该字体安装的每种字体的名称,除非该字体使名称不可读(即符号),我使用默认字体(Segoe UI)。

现在,我正在尝试以下方法并找到了一些我无法理解的内容:

var installedFonts = new System.Drawing.Text.InstalledFontCollection().Families;

foreach (var family in installedFonts)
{
    var font = new Font(family, 12);
    if (font.GdiCharSet == 2) // Symbols font
    {
        // Print using default font
    }
    else // Readable font
    {
        // Print using font
    }
}

它永远不会使用默认字体打印。此外,即使字体使用不同的字符集,每个字体GdiCharSet都会返回1。读得更彻底,它说:

  

此属性返回1,除非在Font(String, Single, FontStyle, GraphicsUnit, Byte)构造函数中指定了不同的字符集。

所以,显然我没有正确创建字体,因为我没有指定Byte值(我完全使用不同的构造函数)。这让我觉得有另一种方式("实际"方式)来了解字体的CharSet值。但我无法在任何地方找到它。有谁知道我怎么能找到这个?

作为旁注,Notepad设法做到这一点。格式>字体...打开字体选择器。您可以看到它显示在脚本下使用的字符集。

enter image description here

1 个答案:

答案 0 :(得分:1)

您应该使用GetTextMetrics函数(https://msdn.microsoft.com/en-us/library/windows/desktop/dd144941(v=vs.85).aspx)。使用interop调用时,它会检索以下结构:

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
internal struct TEXTMETRIC
{
   public int tmHeight;
   public int tmAscent;
   public int tmDescent;
   public int tmInternalLeading;
   public int tmExternalLeading;
   public int tmAveCharWidth;
   public int tmMaxCharWidth;
   public int tmWeight;
   public int tmOverhang;
   public int tmDigitizedAspectX;
   public int tmDigitizedAspectY;
   public char tmFirstChar;
   public char tmLastChar;
   public char tmDefaultChar;
   public char tmBreakChar;
   public byte tmItalic;
   public byte tmUnderlined;
   public byte tmStruckOut;
   public byte tmPitchAndFamily;
   public byte tmCharSet;
}

结构的最后一个成员tmCharSet正是您所寻找的:

  

字体的字符集。字符集可以是其中之一   以下值:ANSI_CHARSET BALTIC_CHARSET CHINESEBIG5_CHARSET   DEFAULT_CHARSET EASTEUROPE_CHARSET GB2312_CHARSET GREEK_CHARSET   HANGUL_CHARSET MAC_CHARSET OEM_CHARSET RUSSIAN_CHARSET   SHIFTJIS_CHARSET SYMBOL_CHARSET TURKISH_CHARSET VIETNAMESE_CHARSET ......

关注this link,您可以找到必要代码的简单实现。