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

raylib中DrawTextEx无法显示Unicode字符的问题求助

问题解决:raylib中DrawTextEx无法渲染西里尔字符

核心原因

DrawTextEx要求输入的字符串为UTF-8编码,若源代码文件编码非UTF-8,或字符串编译时被转换为其他编码(比如Windows默认的GBK),raylib无法正确解析西里尔字符的码点,就会显示问号。而DrawTextCodepoint直接传入十进制码点,绕开了字符串编码问题,因此能正常显示。

解决步骤

1. 统一源代码文件编码为UTF-8

将.c/.cpp文件保存为UTF-8编码(推荐不带BOM,避免部分编译器兼容问题)。比如在VS Code中,可通过右下角编码选择器切换为UTF-8并保存。

2. 明确指定UTF-8字符串字面量

  • C++11及以上版本,用u8前缀标记UTF-8字符串:
    DrawTextEx(font, u8"Ё", (Vector2){10, 70}, 32, 0, BLACK);
    DrawTextEx(font, u8"\u0401", (Vector2){10, 40}, 32, 0, BLACK);
    
  • C语言环境,需确保编译器以UTF-8处理字符串:GCC添加-finput-charset=UTF-8编译选项;MSVC添加/utf-8编译参数。

3. 验证字体加载范围(可选)

你的代码中已通过0x400 + i循环加载了包含0x0401(Ё)在内的西里尔码点,字体加载环节无问题,无需调整。

完整测试代码

#include "raylib.h"

int main() {
    InitWindow(200, 100, "Cyrillic Test");
    SetTargetFPS(60);

    int codepoints[512] = {0};
    for (int i = 0; i < 95; i++) codepoints[i] = 32 + i;
    for (int i = 0; i < 255; i++) codepoints[96 + i] = 0x400 + i;
    Font font = LoadFontEx("arial.ttf", 32, codepoints, 512);

    while (!WindowShouldClose()) {
        BeginDrawing();
        ClearBackground(RAYWHITE);

        DrawTextEx(font, u8"Ё", (Vector2){10, 70}, 32, 0, BLACK);
        DrawTextEx(font, u8"\u0401", (Vector2){10, 40}, 32, 0, BLACK);
        DrawTextCodepoint(font, 0x0401, (Vector2){10, 10}, 32, BLACK);

        EndDrawing();
    }

    UnloadFont(font);
    CloseWindow();
    return 0;
}

额外注意事项

  • Windows下使用MinGW编译器时,可在代码开头添加#pragma execution_character_set("utf-8"),强制字符串编码为UTF-8。
  • 确保使用的arial.ttf是完整版本(比如系统自带的C:\Windows\Fonts\arial.ttf),部分精简版Arial可能缺失西里尔字符集。

内容的提问来源于stack exchange,提问作者Dmitriy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:06:45