【Windows程序设计】Unicode简介
- 字符的发展史
1、最初的字符集ASCII码,128个字符。
2、扩展ASCII码,共有256个字符。
3、双字节字符集(DBCS:double-byte character set)。DBCS从256编码开始,最初的128个代码是ASCII,较高的128个代码中的某些总是跟随着第二个字节。这两个字节一起(称作首字节和跟随字节)定义一个字符,通常是一个复杂的象形文字。双字符集问题并不是说字符由两个字节代表。问题在于一些字符(特别是ASCII字符)由1个字节表示,而另一些字符由两个字节表示。
4、Unicode编码中每个字符占用16个字节,它是一套全球化的编码方案,包括世界上所有的象形符号。然而Unicode编码的问题在于每个字符占用两个字节的空间在某些情况下非常浪费。
因此,有些时候我们希望维护统一的原始程序,它能根据某项标识进行ASCII码编译,也能进行Unicode码编译。在windows编程中,提供了TCHAR.H头文件,它为我们提供了这项功能。
- 宽字符
ANSI C支持8位的character集,也支持16位的宽字符集。宽字符集并不是unicode,unicode是一种宽字符集。
在C语言中,有如下的几种定义字符的方式,它们需要的存储空间如下所示:
char c = 'A'; //c需要一个字节的存储单元。
wchar_t c = 'A'; //c需要两个字节的存储单元
wchar_t * p = L"Hello!"; //p需要四个字节的存储单元,L告诉编译器字符串按宽字符集保存,占14个字节存储,其中包含6个宽字符,和1个2位的0字符
针对宽字符的库函数示例:
char * pc = "Hello!";
iLength = strlen(pc); //可知iLength等于6
wchar_t * pw = L"Hello!";
iLength = wcslen(pw); //iLength等于6
- 宽字符与Windows
若想明确定义8位字符变量和字符串,使用CHAR, PCHAR;
若想明确定义16位字符变量和字符串,使用WCHAR, PWCHAR,并使用L标识字符串;
对于使用8位还是16位字符,取决于UNICODE标识符的定义,此时字符变量和字符串的定义使用TCHAR, PTCHAR,以及TEXT宏。