如何检查哪些字符集(代码页)字体支持(有字母)?

Kro*_*ica 6 delphi fonts character delphi-xe2

对于我的应用程序,我需要显示系统字体列表,但过滤掉所有不支持20种预定义语言的字体(该集合是硬编码的)并仅显示那些字体.

我可以通过调用获得可用字体列表Vcl.Forms.Screen.Fonts.
只知道该列表中的字体名称,如何检查此字体支持的字符集(代码页)(具有实际字母)?

例如,像Arial或Times New Roman这样的常见字体几乎包含所有欧洲语言的字符,包括西里尔语(以及中文等).然而,许多不太常见的字体通常只有英文字母.

该应用程序供内部使用,因此具有一个函数,如果它具有特定于某些字符集/代码页的特定字母(例如???),并且它不被来自另一个通用字体(或某个占位符)的字母替换,则只需查询该字体)就足够了.

Jen*_*nsG 8

GetGlyphIndices函数可以被用来确定在一个字体中是否存在的字形.

引用MSDN文档:

DWORD GetGlyphIndices(
  _In_  HDC     hdc,
  _In_  LPCTSTR lpstr,
  _In_  int     c,
  _Out_ LPWORD  pgi,
  _In_  DWORD   fl
);
Run Code Online (Sandbox Code Playgroud)

参数[...]

fl[in]:指定不支持字形的处理方式.此参数可以是以下值.

GGI_MARK_NONEXISTING_GLYPHS - 使用十六进制值0xffff标记不受支持的字形.

备注再次向的Uniscribe功能内容的链接,如ScriptGetCMap

此函数尝试为lpstr指向的字符串中的每个字符标识单字形表示.虽然这对某些低级目的(例如操作字体文件)很有用,但希望将字符串映射到字形的高级应用程序通常希望使用Uniscribe函数.

由于两个API都是从Win2k开始支持的,因此可能需要使用哪种API.

(编辑:刚刚注意到导入已经在Windows.pas中了)

示例代码

procedure Test( dc : HDC);
var str : UnicodeString;
    buf : array of WORD;
    len,i : Integer;
    count : DWORD;
begin
  str := 'abc'+WideChar($0416)+'äöü';
  len := Length(str);
  SetLength( buf, len);
  count := GetGlyphIndicesW( dc, PWideChar(str), len, @buf[0], GGI_MARK_NONEXISTING_GLYPHS);
  if count > 0 then begin
    for i := 0 to count-1 do begin
      Write('index ',i,': ');
      if buf[i] = $FFFF
      then Writeln('glyph missing')
      else Writeln('ok');
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

产量

index 0: ok
index 1: ok
index 2: ok
index 3: glyph missing
index 4: ok
index 5: ok
index 6: ok
Run Code Online (Sandbox Code Playgroud)

  • 你正在泄漏"GetDC(0)"返回的`HDC`.完成后使用它需要释放它.`dc:= GetDC(0); GetGlyphIndicesW(DC,...); ReleaseDC(0,dc);` (2认同)