Unicode

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核心编程》,里面的一些东西让我有些茅塞顿开的感觉,于是记录下来一些,以备查阅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值