C++ MessageBox不打印UNICODE字符

C++ MessageBox不打印UNICODE字符,c++,winapi,C++,Winapi,我使用以下命令在Win32 APIMessageBox中打印消息: MessageBox(hWnd, TEXT("Já existe um controlador em execução"), TEXT("Erro"), 0); MessageBox是一个宏,正在扩展到MessageBoxW。问题是它不打印Unicode,而调用它的窗口打印Unicode时没有任何问题,这似乎是MessageBox本身的问题 有人知道如何解决这个问题吗 仅供参考,我也尝试

我使用以下命令在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字符。

为了避免将来出现基于源代码编码的问题,您可以对非ascii字符使用
\uxxx
样式转义字符:

MessageBoxW(nullptr, L"J\u00E1 existe um controlador em execu\u00E7\u00E1o", L"Erro", MB_OK);

如果不希望将Unicode字符编码为转义序列,请确保源代码编辑器使用与编译器相同的编码

您所经历的是,您看到的是Unicode字符,但却是错误的字符。每当您(或您的编译器!)使用与编辑器(utf-8)不同的编码(可能是某些iso-8859-?编码)解释文件时,就会调用并发生这种情况


您也可以将编译器配置为使用utf-8。如果您使用的是gcc,您可能需要阅读。

@anastaciu Richard只是确保您真正是为Unicode而不是ANSI编译的。如果
L“…”
未能编译,则意味着
MessageBox
将被解析为
MessageBoxA
,尽管您声称。在任何情况下,您都会说该对话框没有打印Unicode,那么它到底在打印什么呢?你能提供一个屏幕截图吗?我将第一个代码片段复制/粘贴到我的玩具win32项目中,效果很好。请检查你的源文件编码是否为UTF-16而不是UTF-8。这是一个编码冲突,在MS Windows上
L“…”
需要UTF-16。尝试将文件保存为UTF-16,并在保存后检查文件内容以及程序运行时发生的情况。“…L的类型”…“字符串文字是const wchar_t[N],其中N是以执行范围编码的代码单元表示的字符串大小,包括空终止符…”在阅读了所有对话之后,我甚至不确定是否要添加有用的内容。。。我习惯了Windows支持UTF-16(ANSI的东西我不认为是替代的),而我是UTF-8的粉丝。我对Windows API的诡计深信不疑,总是显式地使用
W
-后缀Windows函数(以防万一),并提供显式转换为UTF-16的UTF-8文本(带有相应的函数和动态)。这可能看起来过于设计或过时,但像你这样的问题正是我试图阻止的嗯,这可能是一个很好的解决方案,虽然有点麻烦,但你认为UTF-16在所有情况下都不起作用吗?@anastaciu如果你将文件保存为UTF 16,它会起作用。这是一种安全的选择。您可以编写一个python脚本来对源代码fwiw执行此操作。