Unicode字符串的字母都是16位的(两个字节)。没有特别的字节提示下一字节是同一个字符的一部分还是下一个字节,这意味着可以通过简单的增减一个指针来遍历这个字符串的字符。windows有一些版本是支持Unicode,比如windows 2000。有一些是是不支持的,比如windows 98。
为了在windows下运行Unicode,windows有为Unicode设计的API。实际上,要一个程序支持Unicode,只需要定义两个宏就可以了。UNICODE(这个是在windows头文件定义的)和_UNICODE(这个是在C运行库里面定义的)。
下面我们来比较一下标准ANSI C字符串函数与他们对应的Unicode函数。
int strcmp(const char *,const char *)
char * strcpy(char *,const char *);
size_t strlen(const char *);
int wcscmp(const wchar_t * ,const wchar_t *);
wchar_t *wcscpy(wchar_t *,const wchar_t*);
size_t wcslen(const wchar_t *);
可以看出,所有的Unicode函数都是以wcs开头的,代表宽字符串。当然,相应的头文件也变化了,上面的是在<string.h> 中的,下面的函数在头文件<Tchar.h>中。
为了对这两个更好的兼容,使用了如下的TCHAR数据类型。如果_UNICODE定义了,TCHAR声明如下:
typedef wchar_t TCHAR;
若没有定义,声明如下:
typedef char TCHAR
使用这种数据类型,可以分配一个字符串如下:
TCHAR string[256];
还可以建立一个指向字符串的指针。
TCHAR *ptr = “I am OK!”;
但是这样会出一个问题,微软的C++ 编译器会将所有字符串默认为ANSI字符串,而非Unicode字符串。所以如果没有定义_UNICODE ,编译没有问题。但是一旦 定义了,就会出错。改正如下:
TCHAR *ptr=L“I am Ok!”;
L 是一个提示符,该字符串编译成一个Unicode字符串。当然,有相应的宏来解决这个换过换来的麻烦。在TChar.h 由_TEXT宏实现。如果_UNICODE定义了,_TEXT定义为:
#define _TEXT (x) L ## x
如果没有定义,_TEXT定义如下:
#define _TEXT (x) x
使用_TEXT重写上面的代码就是这样了。
TCHAR *ptr = _TEXT("I am OK!");
windows头文件定义的Unicode数据类型
数据类型 描述
WCHAR Unicode字符
PWSTR 指向Unicode字符串的指针
PCWSTR 指向unicode字符串常量的指针
今天学习《windows核心编程》,里面的一些东西让我有些茅塞顿开的感觉,于是记录下来一些,以备查阅。