为什么AfxMessageBox显示中文字符

时间:2011-05-18 11:33:37

标签: visual-c++ mfc

此代码以中文显示hello

char buffer[10]="hello";
AfxMessageBox((LPCTSTR)buffer);

虽然此代码以英文显示

AfxMessageBox(L"hello");

如果我的代码中出现问题,有人可以告诉我如何正确输入缓冲变量吗

2 个答案:

答案 0 :(得分:1)

LPCTSTR类型是透明STRing的长指针。 这里重要的是T,透明(至少我认为T代表透明)。

如果您的应用程序编译为ASCII应用程序,则所有T类型(如TCHAR)都将重新定义为ASCII对应项。所以TCHAR将变成简单的char。

如果您的应用程序编译为Unicode,则所有T类型都将重新定义为Unicode类型。 TCHAR变成了wchar_t。

所有Windows(和MFC)功能都是如此。所有Windows功能都有两种变体,一种是ASCII版本(例如MessageBoxA),另一种是Unicode版本(例如MessageBoxW)。 MessageBox本身只是MessageBoxA或MessageBoxW的定义(取决于你如何编译)。

在您的示例中,缓冲区被定义为char-vector类型,但您将其转换为指向透明类型的指针。我假设你的应用程序是用Unicode编译的,所以LPCTSTR实际上是一个“wchar_t *”。所以这个演员是不正确的。

在L之前加上“hello”字符串,告诉编译器将常量“hello”作为Unicode字符串,这使得它成为传递给AfxMessageBox的Unicode版本的正确类型。

答案 1 :(得分:0)

如果在编译器选项中定义了_UNICODEUNICODE标志,则转换字符串LPCTSTR会将字符串视为unicode字符串。在Windows的情况下,它将每16个字节视为单个字符,并尝试查找相应的unicode字符。要使其显示英文字符,请在定义数组时使用TCHAR