《Windows 程序设计》学习笔记(二)

类别:VC语言 点击:0 评论:0 推荐:

第二章  Unicode 介绍

 

本章简单介绍了Unicode的发展史,以及在Windows编程中的具体运用。对UNICODE的了解和运用对于进行国际化软件开发是非常重要。(特别是开发共享软件:)

Unicode在《微软英汉双解计算机百科辞典》里是这样解释的:一种16位的字符编码标准。它通过使用两个字节来表示一个字符,这样Unicode就可以用单个字符集来表示世界上几乎所有的书面语言。比较而言,8位的ASCII码就不能表示出罗马字母表中字母和可区分标记的所有组合。

Unicode的出现是计算机在全世界普及的必然结果。因为它是16位的,因此允许表示65536(2的16次方)个字符,这对表示所有字符及世界上使用的象形文字的语言,包括一系列的数学,符号和货币的集合来说是非常充裕的。前128个Unicode字符是ASCII,接下来的128个Unicode字符是ASCII的扩展,其余的字符供不同语言的文字和符号使用。Unicode把全世界所有的可能用到的文字和符号到统一到了一个字符集中,但是Unicode字符串占用的内存是ASCII字符串的两倍。(我觉得现在的硬件发展使这个问题已经不是很明显了。)

可以用wchar_t定义Unicode字符,

wchar_t c=’A’;

wchar_t在WCHAR.H中是这样定义的:

typedef unsigned short wchar_t;

也就是说它是16位的无符号短整型。注意’A’在内存是以0x41,0x00的顺序保存的。还可以定义一个Unicode字符数组,看下面的程序:

#include <windows.h>

#include <iostream.h>

void main()

{

       wchar_t a = 'A';

       cout << sizeof(a) << endl;

 

       wchar_t* p = L"Hello!";

       cout << sizeof(p) << endl;

 

       static wchar_t b[] = L"Hello!";

       cout << sizeof(b) << endl;

 

}

上面的程序在VC6.0下的运行结果是:

2

4

14

其中,p是一个指针,占用4个字节。

对于C++的操作运算符sizeof,因为是在编译时进行处理的,把Unicode字符看作是16位的短整型数据,所以可以正常运行。但对于大多数C++运行期库函数(特别是以字符串作为参数的函数)只有在连接时才进行处理,函数认为Unicode字符串由单字节字符组成,因此无法正常运行,需要新版的函数支持Unicode字符。

注:上面是我的初步理解,不知对不对。如果有理解不正的地方请高手执教。

下面的例子说明了Unicode字符对C++运行期库函数的影响:

#include <windows.h>

#include <string.h>

#include <iostream.h>

void main()

{

       char* pc = "Hello!";

       cout << strlen(pc) << endl;                     //适用于单字节字符

       wchar_t * pw = L"Hello!";

//    cout << strlen(pw) << endl;                     在VC6.0下编译:error     

       cout << wcslen(pw) << endl;                 //适用于Unicode字符

}

运行结果:

6

6

为了使我们的程序即适用于单字节字符(Windows98 现在还有人用它吗?)又适用于Unicode字符(Windows2000,Windows XP也是吧?),可以用一些开关来进行编译时的设定。用的函数如果是ANSI  C标准的,可以通过定义UNICODE来控制;如果不是ANSI  C标准的可以通过定义_UNICODE来控制。例如下面的定义:

#ifdef UNICODE

#define MessageBox MessageBoxW              //适用于Unicode字符

#else

#define MessageBox MessageBoxA              //适用于单字节字符

#endif

同一个MessageBox函数在不同的设定中定义为不同的函数(MessageBoxW和MessageBoxA)。上面的UNICODE的定义可以在VC6.0的Project菜单中选择Setting,然后在C/C++中进行设定。

注:ASCII:American Standard Code for Information Interchang美国信息交换标准码

本文地址:http://com.8s8s.com/it/it2461.htm