我说的是winprin.org在windows上的教程,因为StackO上的许多用户都推荐它。
我基本上试过这个例子:
#include "stdafx.h"
#include "winapiTest1.h"
int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MessageBox(NULL, (LPCWSTR) "Goodbye, cruel world!", (LPCWSTR) "Note", MB_OK);
return 0;
}但是当我运行它时,它会显示消息框,但是其中的每个字符串(甚至标题)都用中文字符表示。
什么地方出问题了?
发布于 2012-07-22 18:53:53
但是当我运行它时,它会显示消息框,但是其中的每一个字符串(甚至标题)都是用汉字表示的。
之所以如此,是因为操作系统正在解释字符串文本,就好像它们是用乌特夫-16编码的一样,尽管它们不是。
像MessageBox()这样的标识符有两种形式:MessageBoxA()函数和MessageBoxW()。MessageBoxA()是接受当前代码页中编码的字符串的"ANSI“版本,而MessageBoxW()是接受以UTF-16编码的字符串的”宽“版本(也就是说,它是”Unicode感知的“)。MessageBox()实际上是一个宏,它根据是否定义了UNICODE宏对其中任何一个宏进行定义。Windows中没有称为MessageBox()本身的实际函数。
问题的症结在于:
MessageBox(NULL, (LPCWSTR) "Goodbye, cruel world!", (LPCWSTR) "Note", MB_OK); 您的项目可能在某个地方有一个#define UNICODE,导致MessageBox()标识符解析为MessageBoxW(),这需要一个UTF-16编码字符串。通常,编译器会向您抱怨(即编译错误),但LPCWSTR强制转换实际上关闭了编译器并强制其编译。
你不能随便抛出一个演员,总是期望它能发挥作用。不幸的是,许多Windows教程(以及一些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。这告诉VisualC++编译器将文本解释为UTF-16编码字符串(请注意,它可能会将其转换为其他C++编译器上的不同编码;这仅适用于VisualC++)。
还请注意,上述建议仅适用于只使用Windows时。一些包装Windows的框架和库有自己的处理Unicode字符串的规定。如果您使用的是框架/库,请按照这些方法进行操作。
发布于 2012-07-22 18:50:06
尝试:
MessageBox(NULL, _T("Goodbye, cruel world!"), _T("Note"), MB_OK);https://stackoverflow.com/questions/11603049
复制相似问题