【问题标题】:MessageBox does not print UNICODE charactersMessageBox 不打印 UNICODE 字符
【发布时间】: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(具有相应的函数和即时)。这可能看起来过度设计或过时,但像你这样的问题正是我试图阻止的。 ;-)

标签: c++ winapi


【解决方案1】:

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

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

【讨论】:

  • 嗯,这可能是一个很好的解决方案,虽然它有点麻烦,你认为 UTF-16 不会在所有情况下都工作?
  • @anastaciu 如果您将文件保存为 UTF 16,它将起作用。这是一种安全的选择。您可以编写一个 python 脚本来对您的源代码执行此操作。
【解决方案2】:

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

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

您也可以将编译器配置为使用 utf-8。如果您使用 gcc,您可能需要阅读 the accepted answer in this SO post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-22
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多