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
相关产品推荐
相关产品推荐

