MessageBox无法打印UNICODE字符。

3
我正在使用以下内容在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字符。


2
@anastaciu Richard 只是想确保您真正编译为 Unicode 而不是 ANSI。如果 L"..." 无法编译,那就意味着 MessageBox 解析为 MessageBoxA,尽管您声称它是 Unicode。无论如何,您说对话框没有打印 Unicode,那么它到底打印了什么?您能提供一张截图吗? - Remy Lebeau
2
检查您的源文件编码是否为UTF-16而不是UTF-8。 - Richard Critten
1
这是一个编码冲突,在MS-Windows上,L" .... "期望的是UTF-16编码。尝试将文件保存为UTF-16,并检查保存后文件的内容以及程序运行时发生的情况。L"..."字符串字面值的类型是const wchar_t[N],其中N是执行宽编码中字符串的代码单元大小,包括空终止符。参考链接:https://en.cppreference.com/w/cpp/language/string_literal - Richard Critten
1
@Scheff'sCat 将它保存为 UTF-16 LE,现在它可以正常工作了,很好地发现了问题,我很乐意接受你的答案,这可能与我在其他任何地方都没有找到类似的帖子有关。 - anastaciu
3
阅读完之前的所有对话后,我甚至不确定是否添加了一些有用的东西... 我习惯于 Windows 支持 UTF-16(我不认为 ANSI 是替代方案),而我是 UTF-8 的粉丝。由于深深地不信任 Windows API 在幕后的诡计,我总是明确使用带有 W 后缀的 Windows 函数(如果需要),并显式将我的 UTF-8 文本转换为 UTF-16(使用相应的函数和即时转换)。这可能看起来过于工程化或老派,但像你遇到的问题正是我试图避免的。;-) - Scheff's Cat
显示剩余15条评论
2个回答

4
为避免未来源代码编码问题,您可以使用\uxxxx风格的转义字符来表示非ASCII字符:
MessageBoxW(nullptr, L"J\u00E1 existe um controlador em execu\u00E7\u00E1o", L"Erro", MB_OK);

1
嗯,那可能是一个不错的解决方案,虽然有点麻烦,你认为UTF-16在所有情况下都不起作用吗? - anastaciu
@anastaciu 如果你将文件保存为UTF 16,它就能正常工作。这是一种比较安全的替代方案。你可以编写一个Python脚本来处理你的源代码。 - Ayxan Haqverdili

0

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

你所遇到的问题是看到了Unicode字符,但是却是错误的字符。这被称为"乱码(Mojibake)",它在你(或者你的编译器!)使用不同的编码方式(很可能是一些iso-8859-?编码)来解释文件时发生,而与你的编辑器(utf-8)不同。

你可以配置你的编译器也使用utf-8编码。如果你正在使用gcc,你可能想阅读这个SO帖子中被接受的回答


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接