首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >winprog.org第一个例子奇怪的行为?

winprog.org第一个例子奇怪的行为?
EN

Stack Overflow用户
提问于 2012-07-22 18:48:10
回答 2查看 234关注 0票数 1

我说的是winprin.org在windows上的教程,因为StackO上的许多用户都推荐它。

我基本上试过这个例子:

代码语言:javascript
复制
#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;
}

但是当我运行它时,它会显示消息框,但是其中的每个字符串(甚至标题)都用中文字符表示。

什么地方出问题了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-22 18:53:53

但是当我运行它时,它会显示消息框,但是其中的每一个字符串(甚至标题)都是用汉字表示的。

之所以如此,是因为操作系统正在解释字符串文本,就好像它们是用乌特夫-16编码的一样,尽管它们不是。

MessageBox()这样的标识符有两种形式:MessageBoxA()函数和MessageBoxW()MessageBoxA()是接受当前代码页中编码的字符串的"ANSI“版本,而MessageBoxW()是接受以UTF-16编码的字符串的”宽“版本(也就是说,它是”Unicode感知的“)。MessageBox()实际上是一个宏,它根据是否定义了UNICODE宏对其中任何一个宏进行定义。Windows中没有称为MessageBox()本身的实际函数。

问题的症结在于:

代码语言:javascript
复制
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的应用程序来说是一种权宜之计.

代码语言:javascript
复制
#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字符串的规定。如果您使用的是框架/库,请按照这些方法进行操作。

票数 5
EN

Stack Overflow用户

发布于 2012-07-22 18:50:06

尝试:

代码语言:javascript
复制
MessageBox(NULL, _T("Goodbye, cruel world!"), _T("Note"), MB_OK);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11603049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档