【发布时间】:2021-06-03 15:52:59
【问题描述】:
我正在使用以下内容在 Win32 API MessageBox 中打印消息:
MessageBox(hWnd, TEXT("Já existe um controlador em execução"), TEXT("Erro"), 0);
MessageBox 是一个宏,正在扩展为MessageBoxW。问题是它不打印Unicode,而调用它的窗口打印Unicode没有任何问题,看来这是MessageBox本身的问题。
有人知道怎么解决吗?
仅供参考,我也试过:
MessageBoxEx(hWnd, TEXT("Já existe um controlador em execução"), TEXT("Erro"), 0, MAKELANGID(LANG_PORTUGUESE, SUBLANG_PORTUGUESE));
但和预期的一样。
这是带有扩展的调用图片:
然后打印出来:
请注意,主窗口菜单包含正确打印的 unicode 字符。
【问题讨论】:
-
@anastaciu Richard 只是确保您确实是为 Unicode 而不是为 ANSI 编译。如果
L"..."编译失败,这意味着MessageBox解析为MessageBoxA,尽管您声称。无论如何,您说对话框没有打印 Unicode,那么它到底打印了什么?可以提供截图吗? -
我将第一个代码 sn-p 复制/粘贴到我的玩具 win32 项目中,它运行良好。
-
检查您的源文件编码是 UTF-16 而不是 UTF-8。
-
这是一个编码冲突,在 MS-Windows 上
L" .... "需要 UTF-16。尝试将文件保存为 UTF-16 并在保存后检查文件的内容以及程序运行时发生的情况。 "...L"..." 字符串文字的类型是 const wchar_t[N],其中 N 是执行范围编码的代码单元中字符串的大小,包括空终止符... ." en.cppreference.com/w/cpp/language/string_literal -
在阅读完所有对话之后,我什至不确定添加一些有用的东西......我已经习惯了 Windows 支持 UTF-16(我不认为是 ANSI 的东西)替代),而我到处都是 UTF-8 的粉丝。深深地不相信 Windows API 的诡计,我总是明确地使用
W-suffixed Windows 函数(以防万一)并提供我的 UTF-8 文本显式转换为 UTF-16(具有相应的函数和即时)。这可能看起来过度设计或过时,但像你这样的问题正是我试图阻止的。 ;-)