《windows程序设计》此书中第二章Unicode有些理解不了

追风筝的孩子 2011-05-17 10:10:54
书中说windows有两种调用入口,一种是ASCII,另一种是Uncode
描述是:

#ifdef UNCODE
.....
.....
else
.....
.....



代码我就省略了,我想问的是我在vc里分别新建了2个win32 application,就用MessageBox输出一个字符串"hello",另一个用MessageBox输出中文"阿门",前者应该是第一种入口吧,后者是第二种

那么程序是如何判定是哪种入口的呢。
我们现在使用的计算机,我用的是XP系统,是用Unicode的吧?那GBK呢?

比如这个百度知道是我提问的,里面的回答也没有提到Uncode,头大啊= =
...全文
87 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
就想叫yoko 2011-05-18
  • 打赏
  • 举报
回复
windows核心编程上说得不错
事故的故事 2011-05-18
  • 打赏
  • 举报
回复
学习一下 Unicode 是 国际通用编码 asc 不能解析中文~
老邓 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 a328240784 的回复:]

原来是你以前回答过的.....我搜索你里面的某一句话,搜到了你以前的回答= =
[/Quote]
嗯,其实看完这一段,就会对Unicode/ANSI理解的比较好了。
追风筝的孩子 2011-05-17
  • 打赏
  • 举报
回复
原来是你以前回答过的.....我搜索你里面的某一句话,搜到了你以前的回答= =
老邓 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 a328240784 的回复:]

引用 2 楼 loaden 的回复:
是否采用Unicode编码的根本不在中文和英文的区别。
供参考:
VS2005/2008/2010在创建工程时,默认使用的是UNICODE工程。
不过,在创建工程之后,可以修改配置,让工程改用ANSI字符集,以VS2010为例,方法如下:
项目—右键—属性—C/C++—Language—WChar_t—No,如图所示:


当然,这种将UNI……
[/Quote]
有备无患^_^
追风筝的孩子 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 loaden 的回复:]
是否采用Unicode编码的根本不在中文和英文的区别。
供参考:
VS2005/2008/2010在创建工程时,默认使用的是UNICODE工程。
不过,在创建工程之后,可以修改配置,让工程改用ANSI字符集,以VS2010为例,方法如下:
项目—右键—属性—C/C++—Language—WChar_t—No,如图所示:


当然,这种将UNICODE字符集改用ANSI字符集的方法,是……
[/Quote]= =老邓,那玩意你是怎么搜出来的,我知道你这么短时间写不出,还是说那是你之前回答过的问题?
老邓 2011-05-17
  • 打赏
  • 举报
回复
是否采用Unicode编码的根本不在中文和英文的区别。
供参考:
VS2005/2008/2010在创建工程时,默认使用的是UNICODE工程。
不过,在创建工程之后,可以修改配置,让工程改用ANSI字符集,以VS2010为例,方法如下:
项目—右键—属性—C/C++—Language—WChar_t—No,如图所示:


当然,这种将UNICODE字符集改用ANSI字符集的方法,是不被推荐的!
因为Win2K以上系统,内核直接支持的就是Uniocde版本的API,UNICODE工程具有更高的执行效率!而且还可以很容易地在不同语言之间进行数据交换,进而多语言支持。

推荐:用宏实现对ANSI和Unicode通用的编程

如果我们想要我们的程序有两个版本:ANSI版本和Unicode版本。当然,编写两套代码分别实现ANSI版本和Unicode版本完全是行得通的。但是,针对ANSI字符和Unicode字符维护两套代码是非常麻烦的事情。为了减轻编程的负担,C++定义了一系列的宏,帮助您实现对ANSI和 Unicode的通用编程。C++宏实现ANSI和Unicode的通用编程的本质是根据”_UNICODE”(注意,有下划线)定义与否,这些宏展开为ANSI或Unicode字符(字符串)。

如下是tchar.h头文件中部分代码摘抄:

#ifdef _UNICODE
typedef wchar_t TCHAR;
#define __T(x) L##x
#define _T(x) __T(x)
#else
#define __T(x) x
typedef char TCHAR;
#endif

可见,这些宏根据“_UNICODE” 定义与否,分别展开为ANSI或Unicode字符。

C++为字符串函数也定义了一系列宏,同样,我们只例举几个常用的宏:

宏 未定义_UNICODE(ANSI字符) 定义了_UNICODE(Unicode字符)
_tcschr strchr wcschr
_tcscmp strcmp wcscmp
_tcslen strlen wcslen


编码时,在涉及ANSI与UNICODE字符集区别的函数调用时,一律用宏来替代。
这样就可以实现一套代码,根据_UNICODE是否定义,来决定编译成ANSI版本,还是UNICODE版本。

这在WinAPI中的应用更频繁,例如代码:

#include <windows.h>

int main()
{
MessageBox(0, "test", "title", 0);
return 0;
}

中的MessageBox,很多人会认为MessageBox是一个API,其实它是一个宏:

WINUSERAPI
int
WINAPI
MessageBoxA(
__in_opt HWND hWnd,
__in_opt LPCSTR lpText,
__in_opt LPCSTR lpCaption,
__in UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
__in_opt HWND hWnd,
__in_opt LPCWSTR lpText,
__in_opt LPCWSTR lpCaption,
__in UINT uType);
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif // !UNICODE

可以看到,对Windows API来讲,与C/C++库函数中对ANSI/UNICODE的区分不一样的地方是:它要用一个叫做:UNICODE(注意前面少了一个下划线)的宏来决定是使用ANSI版本,还是UNICODE版本。
而且,很通用的,ANSI版本的最后一个字符是A,而UNICODE版本的最后一个字符是W。
ljt3969636 2011-05-17
  • 打赏
  • 举报
回复
是看你的工程是不是使用Uncode字符集

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧