我们如何知道真实类型字体的代码点是否超过0xFFFF?

时间:2012-04-07 19:36:10

标签: c++ windows unicode true-type-fonts

我们如何知道真实类型字体的代码点是否超过0xFFFF?

3 个答案:

答案 0 :(得分:2)

有一个API(GetFontUnicodeRanges / GetGlyphIndices),但它不会超过0xFFFF,因为我怀疑你知道。

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

  1. 解析.ttf文件(the spec是开放式的)
  2. 尝试并测量您感兴趣的字符的输出,并将测量值与已知的替换字符进行比较
  3. 这个答案有一个.NET / C#解决方案:Get supported characters of a font - in C#

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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);