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

GLFW如何将错误信息传入MessageBox避免出现中文乱码问题

问题根因

你的乱码问题核心是编码不匹配:

  • GLFW错误回调返回的description是UTF-8编码的窄字符串(char*类型)
  • 你直接将char*强制转换为LPCWSTR(即const wchar_t*),相当于把UTF-8字节流直接按Windows默认的UTF-16宽字符规则解析,必然出现乱码。

解决方案

提供两种生产环境可用的实现方式,按需选择即可:

方案1:使用Win32原生API转码(兼容性最好,无额外依赖)

通过MultiByteToWideChar把UTF-8字符串转成Windows宽字符格式后再调用弹窗:

#include <windows.h>
#include <GLFW/glfw3.h>

static void glfwError(int id, const char* description)
{
    // 计算转码需要的宽字符缓冲区长度
    int wstrLen = MultiByteToWideChar(CP_UTF8, 0, description, -1, NULL, 0);
    wchar_t* wDescription = (wchar_t*)malloc(wstrLen * sizeof(wchar_t));
    // 执行UTF-8到UTF-16的转码
    MultiByteToWideChar(CP_UTF8, 0, description, -1, wDescription, wstrLen);
    
    MessageBoxW(NULL, wDescription, L"GLFW运行错误", MB_OK | MB_ICONERROR);
    free(wDescription);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    glfwSetErrorCallback(&glfwError);
    // 后续你的GLFW初始化逻辑
    return 0;
}

方案2:C++11及以上版本使用标准库转码(无需手动管理内存)

用标准库的编码转换工具实现转码:

#include <windows.h>
#include <GLFW/glfw3.h>
#include <string>
#include <codecvt>

static void glfwError(int id, const char* description)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    std::wstring wDescription = converter.from_bytes(description);
    MessageBoxW(NULL, wDescription.c_str(), L"GLFW运行错误", MB_OK | MB_ICONERROR);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    glfwSetErrorCallback(&glfwError);
    // 后续你的GLFW初始化逻辑
    return 0;
}

补充注意

不同编码的字符串指针不要直接强制转换,强转只会改变编译器对指针指向内容的解读规则,不会对字符串本身的存储编码做任何转换,这是Windows平台字符编码类问题最常见的诱因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:54:01