Flipper Zero中文字体显示实战指南
Flipper Zero中文字体显示实战指南【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware你编译 flipperzero-firmware 刷进设备后期望在菜单里看到的中文变成了方块。这不是屏幕问题也不是 locale 设置问题而是系统自带的字体数据里根本没有汉字字形你需要自己转换一份 u8g2 中文字体喂给它。中文变方块的根因缺字形数据不是引擎不支持文本渲染分两层上层是 GUI 服务 applications/services/gui/底层是 lib/u8g2/ 绘图库。lib/u8g2/u8g2.h 里已经定义了U8G2_WITH_UNICODE绘制引擎能处理 Unicode 基本多文种平面缺的只是字体文件里的汉字。系统内置的 helvB08、profont11 等全部是拉丁字体。canvas.c 的字体枚举切换写得很直白传入不认识的指针会直接崩溃} else if(font FontBigNumbers) { u8g2_SetFont(canvas-fb, u8g2_font_profont22_tn); } else { furi_crash(); }另外 locale 服务 只管计量单位、12/24 小时制、日期格式三项没有任何语言维度。所以指望在设置菜单里加个中文选项解决显示问题方向就错了正确路径是走字体。把中文字体推进固件的做法把 TTF 转成 u8g2 的 const 字体数组在 PC 上用 u8g2 官方 font converter 脚本把 TTF 转成 .c/.h产物是const uint8_t数组数组直接进应用 flash绘制时原地取用不额外占用 RAM转换时选位图字体变体带_tr、_ch之类的后缀128x64 的屏上位图渲染更稳定别拿全量字库直接转先做子集化再转换顺序反了白干用 canvas_set_custom_u8g2_font 把中文字体挂到 Canvas在绘制回调里调用canvas_set_custom_u8g2_font(canvas, 字体数组)即可切换完整流程见 example_custom_font 示例切换只作用于当前 Canvas其他界面和弹窗仍是默认拉丁字体想让整个应用中文化就要逐屏切换千万不要把自定义字体指针塞进Font枚举传给canvas_set_font会落进furi_crash()分支const uint8_t u8g2_font_cjk_t_cn[] ...; // 转换器输出 canvas_set_custom_u8g2_font(canvas, u8g2_font_cjk_t_cn); canvas_draw_str(canvas, 0, 6, 这是中文);用 pyftsubset 把字库压到几百 KB16px 下一个汉字约 32 字节3500 字就是 110KB 起应用的 flash 预算很紧建议先用 fonttools 的pyftsubset子集化只保留你的应用实际用到的菜单字、状态词、数字和符号转换前先看一眼产物文件大小留足余量再进固件后续要加新汉字时重新子集化并重新生成不要手改数组避坑与验证屏幕渲染全是豆腐块 → 检查字体文件字形覆盖 → 确认子集化的源 TTF 里真有这些字且编码是 UTF-8启动即崩溃 → 检查字体切换调用点 → 换成canvas_set_custom_u8g2_font避开枚举的崩溃分支编译提示 flash 溢出 → 看构建日志里数组大小 → 减字数或把字号降到 12px只有部分汉字缺失 → 检查复制过程是否编码损坏 → 确认转换器输入输出都是 UTF-8最简验证刷机后打开你的测试界面中文一行完整、不重叠且构建日志里 flash 占用没逼近上限就算通过。延伸资源自定义字体示例加载自定义字体的标准写法GUI Canvas 头文件字体切换的入口u8g2 库与字体声明内置字体清单和U8G2_WITH_UNICODE开关locale 服务将来扩展语言维度时的下手位置示例应用目录新建应用时参考中文字体显示的实质就一句话引擎早支持了你只需供对字形数据并控制 flash 体积。可以从 example_custom_font 的示例起步先在屏幕上画出一行中文再谈字库范围。【免费下载链接】flipperzero-firmwareFlipper Zero firmware source code项目地址: https://gitcode.com/GitHub_Trending/fl/flipperzero-firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
