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

使用MessageBoxW显示阿拉伯语Unicode字符出现乱码如何解决

问题根因
  • 宏使用错误:_TEXT(即_T)宏的作用是根据编译期是否定义UNICODE宏,自动给字符串添加L前缀适配宽字符API、或者不加前缀适配ANSI API。你已经手动给字符串加了L宽字符标记,再套一层_TEXT完全多余;如果编译时未开启UNICODE宏,该宏还会把你写的宽字符串错误展开为窄字符串,和MessageBoxW要求的LPCWSTR参数类型冲突。
  • 核心问题是源码编码不匹配:MSVC编译器默认不会将无BOM的UTF-8源文件按UTF-8格式解析,会回退到系统当前ANSI代码页读取源码中的字符串字面量。如果你写阿拉伯语内容时,源文件存为了无BOM的UTF-8或者其他非Windows原生识别的编码格式,编译器解析L"بسم الله الرحمن الرحيم"时会读错字节序列,最终嵌入到程序里的宽字符根本不是正确的阿拉伯语Unicode码点,弹窗自然显示乱码。
修复步骤
  1. 删除多余的_TEXT宏包裹:既然明确调用宽字符版本MessageBoxW,直接传L前缀的宽字符串即可,不需要TCHAR系列宏做适配。
  2. 重新保存源文件:将.cpp文件保存为带UTF-8 BOM的编码格式,或者直接存为UTF-16 LE(Windows原生宽字符编码),保证编译器能正确识别源码里的阿拉伯语字面量,转换成正确的UTF-16码点写入程序二进制。
  3. 若使用MSVC2015及以上版本,也可以直接给编译器添加/utf-8编译参数,或者在源码开头加入#pragma execution_character_set("utf-8"),强制编译器按UTF-8处理源文件和执行字符集,避免编码解析错误。

修复后的可运行代码如下:

#include <windows.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     // 注意:必须保证本文件保存为带BOM的UTF-8或UTF-16 LE编码
     MessageBoxW(NULL, L"بسم الله الرحمن الرحيم", L"HelloMsg", MB_OK);
     return 0;
}

补充:极少数情况下如果改完编码仍显示异常,检查当前Windows系统是否安装了阿拉伯语显示字体支持,Win10及之后的系统默认自带该支持,几乎不会出现缺字体的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:45:52