如何使用FreeType库API获取字体中可用的字形范围
如何高效遍历FreeType字体中的可用字形码点?
当然有更高效的迭代式方案——FreeType专门提供了FT_Get_First_Char和FT_Get_Next_Char这对API,完美解决你提到的两个痛点:
- 天然支持全范围Unicode码点,包括超出U+FFFF的扩展平面字符
- 无需暴力遍历,直接读取字体内部的字符映射表(cmap),效率远高于逐码点检查
使用步骤
- 调用
FT_Get_First_Char获取字体中第一个存在字形映射的Unicode码点,同时得到对应的字形索引 - 循环调用
FT_Get_Next_Char,传入当前码点,依次获取下一个有效码点,直到返回值为0时终止循环
代码示例
#include <ft2build.h> #include FT_FREETYPE_H #include <stdio.h> int main() { FT_Library library; FT_Face face; FT_Error error; // 初始化FreeType库并加载字体(替换为实际字体文件路径) error = FT_Init_FreeType(&library); if (error) return 1; error = FT_New_Face(library, "/path/to/your/font.ttf", 0, &face); if (error) return 1; FT_UInt glyph_index; FT_ULong current_cp = FT_Get_First_Char(face, &glyph_index); // 遍历所有有效码点 while (current_cp != 0) { printf("Unicode码点: U+%04lX, 对应字形索引: %u\n", current_cp, glyph_index); current_cp = FT_Get_Next_Char(face, current_cp, &glyph_index); } // 清理资源 FT_Done_Face(face); FT_Done_FreeType(library); return 0; }
补充说明
- 这两个函数会自动处理字体中所有已注册的字符映射表,无需手动指定cmap格式
- 返回的码点可能包含私用区域字符,可根据需求自行过滤
内容的提问来源于stack exchange,提问作者Yuri Astrakhan
相关产品推荐
相关产品推荐

