2025-01-09解决 `egui` 中文字符显示问题

解决 egui 中文字符显示问题

日期: [填写日期]
作者: [你的名字]
关键词: egui, 中文字符, 字体加载, Rust


问题描述

egui 默认只加载拉丁文字符,因此无法正常显示中文字符。为解决此问题,需要手动加载字体文件。


解决方案

1. 加载静态字体文件

如果使用静态字体文件(如 .ttf 文件),可以通过以下方式加载:

let font_data = egui::FontData::from_static(include_bytes!("xxxxx.ttf"));
let mut fonts = egui::FontDefinitions::default();
fonts.font_data.insert(
    "CustomFont".to_owned(), // 字体名称
    font_data,               // 加载字体数据
);
fonts
    .families
    .get_mut(&egui::FontFamily::Proportional)
    .unwrap()
    .insert(0, "CustomFont".to_owned()); // 使用自定义字体
cc.egui_ctx.set_fonts(fonts); // 设置字体

参考文章:静态字体加载示例

2. 加载 Windows 系统字体

如果需要使用 Windows 系统的字体(如 Microsoft YaHei),可以通过以下步骤实现:

  1. 获取系统字体路径
    通过系统变量找到系统字体目录(通常是 C:\Windows\Fonts),然后加载目标字体文件。

使用 std::env::var 获取系统根目录:

use std::env;

let system_root = env::var("SystemRoot").expect("无法获取系统根目录");
let font_path = format!("{}\\Fonts\\msyh.ttc", system_root); // 字体文件路径
  1. 加载字体并设置
    使用 std::fs::read 读取字体文件,并将其加载到 egui 中:
use std::fs;
use std::env;

// 获取系统字体路径
let system_root = env::var("SystemRoot").expect("无法获取系统根目录");
let font_path = format!("{}\\Fonts\\msyh.ttc", system_root); // 字体文件路径

// 加载字体文件
let font_data = fs::read(font_path).expect("无法加载字体文件");

let mut fonts = egui::FontDefinitions::default();
fonts.font_data.insert(
    "Microsoft YaHei".to_owned(),          // 字体名称
    egui::FontData::from_owned(font_data), // 加载字体数据
);
fonts
    .families
    .get_mut(&egui::FontFamily::Proportional)
    .unwrap()
    .insert(0, "Microsoft YaHei".to_owned()); // 使用系统字体
cc.egui_ctx.set_fonts(fonts.clone()); // 使用 clone 避免移动所有权

注意事项

  1. 字体文件路径

    • 确保字体文件路径正确。

    • 如果路径中包含中文字符,可能需要处理编码问题。

  2. 字体名称

    • 字体名称需要与字体文件的实际名称一致。

    • 可以通过系统字体管理器查看字体名称。

  3. 性能优化

    • 如果加载的字体文件较大,可能会影响性能,建议选择较小的字体文件或优化加载逻辑。

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容