第二章 Unicode
Unicode-宽字节字符集是是为了解决软件本地化(多语言版本化)而定制的一项技术标准。Unicode字符串中的所有字符都是16位的(两个字节),程序员只需要对指针进行递增或者递减,就可以遍历字符串中的各个字符,不在需要像单字节字符一样去判断下一字节是属于同一字符的组成部分还是一个新字符。
使用Unicode,有几个好处,可以很容易地在不同语言之间进行数据交换、使你能够分配支持所有语言的单个二进制.exe文件或DLL文件、提高应用程序的运行效率。
各Windows操作系统对Unicode的支持:
Windows 2000既支持Unicode,也支持ANSI,因此可以为任意一种开发应用程序。
Windows 98只支持ANSI,只能为ANSI开发应用程序。
Windows CE只支持Unicode,只能为Unicode开发应用程序。
因为COM通常用于使不同的组件能够互相进行通信,而Unicode则是传递字符串的最佳手段。所以需要字符串的所有COM接口方法都只能接受Unicode字符串。
2.8 如何编写Unicode源代码
C对Unicode的支持
定义一个名字为wchar_t的数据类型,它便是一个Unicode字符的数据类型。For example,如果想要创建一个缓存,用于存放最多为99个字符的Unicode字符串和一个结尾为零的字符,可以使用下面这个语句:
wchar_t szBuffer[100];
当然,C里面的字符串函数,如strcpy、strchr、strcat等,只能对ANSI字符串进行操作,不能正确处理Unicode,因此,ANSI C补充了一组函数:
ANSI: char * strchr(const char * , int);
Unicode: wchar_t * wcschr(const wchar_t * , wchar_t);
ANSI: int strcmp(const char * , const char *);
Unicode: int wcscmp(const wchar_t * , const wchar_t *);
ANSI: char * strcpy(char * , const char *);
Unicode: wchar_t * wcscpy(wchar_t * , const wchar_t *);
ANSI: size_t strlen(const char *);
Unicode size_t wcslen(const wchar_t *);
请注意,所有的Unicode函数均以wcs开头,wcs是宽字符串的英文缩写。若要调用Unicode函数,只需用前缀wcs来取代ANSI字符串函数的前缀str即可。
一般情况下,对ANSI和Unicode字符操作的函数不要写在同一个源代码文件中,这会给编译器编译带来很多麻烦(编译错误),但实在有必要的时候,也可以将他们放在同一个源代码文件中,这时候就需要包含一个头文件 TChar.h 。
TChar.h头文件的唯一作用是就是帮助创建ANSI/Unicode通用的源代码文件。它的工作机制是,通过一组宏,来决定调用的是str函数还是wcs函数。For example ,在TChar.h中定义有一个宏为_tcscpy,如果在包含该头文件时没有定义_UNICODE,那_tcscpy就想当于ANSI的strcpy,如果定义了_UNICODE,则_tcscpy想当于wcscpy函数。
还有一个值得注意的是,使用了TChar.h中的宏的时候,若要生成一个Unicode字符串而不是一个ANSI字符串,则必须在字符串前加上一个大写字符L,For example :
TCHAR * szError = L"Error";
大写字母L的用意是告诉编译器,该字符串应该作为Unicode字符来编译。此举随之带来的问题是,我们还需要定义个宏来动态添加大写字母L,以适应Unicode/ANSI通用源代码文件。这个宏便是_TEXT。
TCHAR *szError = _TEXR("Error");
如上这样定义的话,就不论源代码文件中是否定义了_UNICODE,编译器都能够正确辨认并编译。此外,_TEXT宏还可以用于检验字符串的首字母。For example :
if(szError[0] ==_TEXT('J'))
{
//首字母为"J"时的处理
}
else
{
//首字母不是"J"的时候
}
2004年11月9日