我们如何知道真类型字体是否具有高于0xFFFF的代码点

How do we know if a true type font has code points above 0xFFFF?

本文关键字:高于 0xFFFF 代码 是否 何知道 类型 字体 我们      更新时间:2023-10-16

我们如何知道真正的字体是否具有高于0xFFFF的代码点?

有一个

API(GetFontUnicodeRanges/GetGlyphIndex),但它并没有超过0xFFFF,我怀疑你知道。

有两种明显的方法可以通过编程方式查找:

  1. 解析.ttf文件(规范是开放的)
  2. 尝试测量您感兴趣的字符的输出,并将测量值与已知的替换字符进行比较

此答案有一个 .NET/C# 解决方案:获取字体支持的字符 - 在 C# 中

如果运行Windows 7+,则可以调用

DirectWrite的IDWriteFontFace::GetGlyphIndices从给定代码点的cmap中获取名义字形ID,或者如果您只想了解所有范围,则可以调用IDWriteFontFace1::GetUnicodeRanges(Win 8+或Windows 7的平台更新)。GDI GetGlyphIndices 和 Uniscribe ScriptGetCmap仅支持基本的多语言平面。

ScriptShape API 来救援。Windows 7 及更高版本。与ScriptGetCMap不同,它支持UTF-16代理项对。对于不受字体支持的字符,它将返回零字形索引。

下面的示例假定只有一个字形字符串。缓冲区都是静态的。有关缓冲区大小要求,请参阅 API 文档。

wchar_t ws[] = L"  "; // Known astral plane character
SelectObject(hDC, hFont); // Font to analyze - construct your own
SCRIPT_CACHE ScCache = nullptr; //One of those per font, per size.
HRESULT hr;
SCRIPT_ITEM si[3]; // Static buffers here :(
int ci;
WORD Glyphs[10], Clust[10];
SCRIPT_VISATTR sva[10];
hr = ScriptItemize(ws, wcslen(ws), 2, nullptr, nullptr, si, &ci);
int ng;
hr = ScriptShape(hDC, &ScCache, s, s[1] ? 2 : 1, _countof(Glyphs), &si[0].a, Glyphs, Clust, sva, &ng);
// For the win!
bool FontSupportsThisGlyph = (ng == 1 && Glyphs[0] != 0);