但是当我运行它时,它会显示消息框,但其中的每个字符串(甚至标题)都以汉字表示。
原因是操作系统将您的字符串文字解释为好像它们是使用UTF-16编码的,即使它们不是。
像这样的一些标识符MessageBox()
有两种形式:一个MessageBoxA()
函数和一个MessageBoxW()
. MessageBoxA()
是接受以当前代码页编码的字符串的“ANSI”版本,MessageBoxW()
是接受以 UTF-16 编码的字符串的“宽”版本(即它是“Unicode-aware”)。MessageBox()
实际上是一个宏,根据是否定义了宏来定义其中之一UNICODE
。Windows API 中没有被调用的实际MessageBox()
函数。
问题的症结在这里:
MessageBox(NULL, (LPCWSTR) "Goodbye, cruel world!", (LPCWSTR) "Note", MB_OK);
您的项目可能有一个#define UNICODE
地方,导致MessageBox()
标识符解析为MessageBoxW()
,它需要一个 UTF-16 编码的字符串。通常,编译器会向您抱怨它(即编译错误),但LPCWSTR
强制转换本质上会关闭编译器并强制它编译。
您不能只是随机投掷并总是期望它起作用。不幸的是,很多 Windows API 教程(以及一些一般的 C++ 教程)在不必要甚至不合适的时候到处滥用。
James 提出的解决方案使用_T()
宏,这有助于对其进行设置,以便正确编码字符串文字,而无需强制转换。但是,对于新应用程序来说,一个更好的解决方案是忘记函数的 ANSI 版本,而一直使用 Unicode。该_T()
宏是过渡到 Unicode 感知 API 的应用程序的权宜之计。
#include "stdafx.h" // Make sure UNICODE is defined before windows.h
#include "winapiTest1.h"
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPCSTR lpCmdLine,
int nCmdShow)
{
MessageBox(NULL, L"Goodbye, cruel world!", L"Note", MB_OK);
return 0;
}
请注意,字符串文字现在有一个L
前缀。这告诉 Visual C++ 编译器将文字解释为 UTF-16 编码字符串(请注意,它可能会在其他 C++ 编译器上将其转换为不同的编码;这仅适用于 Visual C++)。
另请注意,上述建议仅适用于仅使用 Windows API 时。一些包装 Windows API 的框架和库有自己的处理 Unicode 字符串的规定。如果您使用的是框架/库,请遵循这些。