第二章 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美国信息交换标准码