我们如何知道真实类型字体的代码点是否超过0xFFFF?
答案 0 :(得分:2)
有一个API(GetFontUnicodeRanges / GetGlyphIndices),但它不会超过0xFFFF,因为我怀疑你知道。
有两种明显的方法可以以编程方式查找:
.ttf
文件(the spec是开放式的)这个答案有一个.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);