如何获取跨平台可用于SDL TTF的TTF字体列表
跨平台获取系统TTF字体列表的通用实现方案
方案1:分平台调用原生API实现(大部分软件采用的主流方案)
这个方案无需引入额外第三方依赖,运行效率最高,是VS Code、GIMP等软件的核心实现逻辑:
- Windows平台:
不要硬编码C:\\Windows\\Fonts路径,通过系统API直接获取正确的字体目录:- 调用
SHGetKnownFolderPath传入FOLDERID_Fonts获取系统级字体目录 - 调用
SHGetKnownFolderPath传入FOLDERID_RoamingAppData,拼接\\Microsoft\\Windows\\Fonts获取用户级自定义字体目录 - 也可以直接调用
EnumFontFamiliesExWAPI直接枚举所有已注册的字体,直接获取字体名和对应文件路径,无需自行遍历目录
- 调用
- Linux平台:
无需自行遍历目录或多用户路径,直接使用所有桌面发行版默认预装的Fontconfig库的C API:- 初始化Fontconfig上下文后调用
FcFontList接口,可直接筛选出所有TTF格式字体的路径、字体家族名、样式等信息 - 编译时添加链接参数
-lfontconfig,头文件引用<fontconfig/fontconfig.h>即可,无额外依赖
- 初始化Fontconfig上下文后调用
- macOS平台:
调用系统原生CoreText框架接口:- 调用
CTFontManagerCopyAvailableFontURLs直接获取所有系统可用字体的路径,自动覆盖系统级、用户级的所有字体目录 - 编译时添加链接参数
-framework CoreText即可
- 调用
方案2:直接使用封装好的开源库
如果不想自行编写平台分支代码,可以直接使用已经封装好的跨平台字体枚举库:
- 单头文件实现:可直接引入开源的单头文件C/C++字体枚举库,无需额外编译依赖,已经封装了三个平台的原生接口调用逻辑
- 若项目已使用GTK、Qt等框架,可直接使用框架内置的字体枚举接口:如Qt的
QFontDatabase类、GTK的Pango库相关接口,一行代码即可获取完整字体列表
注意事项
- 不要使用全盘搜索的方案,效率极低,且会遗漏部分自定义挂载路径的字体
- 不要硬编码各系统的字体路径,不同用户的系统安装位置、自定义配置可能导致路径不一致,必须通过系统API读取
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

