在 Windows 中,如何检测 Unicode 字符是否呈现为正方形(豆腐)?

In Windows, how to detect if a Unicode character renders as square (tofu)?

我正在为 OpenGL 编写一个简单的位图字体渲染器,我也想渲染一些 Unicode。然而,在许多字体中,一些字符丢失并呈现为正方形。这些因此会在我的纹理中浪费 space,我想摆脱它们。有没有WinAPI函数可以检测某个字符是否会使用某种字体渲染成豆腐方块?

我正在使用 GDI,我使用 CreateDIBSection 创建了一个屏幕外位图,然后使用 CreateFontIndirect 获取字体并使用 ExtTextOutW.

渲染字形

到目前为止,我一直在考虑检测光栅化形式的豆腐(通过比较像素)哪种方法可行,但我想这不是很好。它还要求我获得一些给定字体肯定没有的 Unicode 字符,以便获得 "template" 进行比较。我想我迟早会惹上麻烦的。

在为 3D 渲染器构建字形映射时,我不得不做一些类似的事情来实现我自己的字体链接和字体回退。我使用 Uniscribe 将字符串转换为字形索引字符串并转换为字体。然后我使用 ScriptGetFontProperties 获取字体的 wgDefault 属性 并将该值与每个字形索引进行比较。

纯 GDI 等价物是使用 GetCharacterPlacement 之类的东西将文本转换为字形索引(然后将 ExtTextOut 与 ETO_GLYPH_INDEX 一起使用),但我认为这还不够Uniscribe 会进行的密钥整形和重新排序。对于初学者,我认为这对 BMP 以外的任何东西都不起作用。

您不想在图形上匹配缺失的符号字形,因为它并不总是正方形。例如,在某些字体中,它是一个带有问号的黑色菱形。