You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FreeType库API获取字体中可用的字形范围

如何高效遍历FreeType字体中的可用字形码点?

当然有更高效的迭代式方案——FreeType专门提供了FT_Get_First_Char和FT_Get_Next_Char这对API,完美解决你提到的两个痛点:

  • 天然支持全范围Unicode码点,包括超出U+FFFF的扩展平面字符
  • 无需暴力遍历,直接读取字体内部的字符映射表(cmap),效率远高于逐码点检查

使用步骤

  1. 调用FT_Get_First_Char获取字体中第一个存在字形映射的Unicode码点,同时得到对应的字形索引
  2. 循环调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:42:36