Unicode扩展自ASCII字符集,在严格的ASCII中,每个字符用7位表示,在计算机中使用8位宽。ASCII字符集中,只含有美国英语常用的字符,就是一个美国标准,对于其他使用英语的国家,很多字符都没有编码,比如英镑的符号。更不用说中日韩(CJK)国家的汉字系统。
因此,为了解决程序可以在不同字符的系统中使用,C程序的一些数据类型需要进行相应的更改来符合Unicode标准,比如ANSI
C(ASCII标准)中char类型,字宽为一个字节(8位),也就是说使用sizeof(char)返回值是1。在Unicode标准中,字符字宽为1一个字(16位),使用关键词wchar_t表示,该关键词在WCHAR.H头文件中定义如下:
typedef
unsigned short wchar_t;
也就是说,在Unicode中,宽字符即无符号整型。那么,使用sizeof(wchar_t)返回值就是2。如下:
那么,随之而来的问题就是新版本的char类型,怎样访问ASCII版的库函数。举一个例子来说,比如字符串长度函数strlen(在string.h中定义),对于char类型:
char *p1 =
“ASCII\n”;
iLength =
strlen(p1);
这样写没有任何问题,iLength的结果为p1字符串长度6。如果定义宽字符串:
wchar_t *p2=
“Unicode\n”;
iLength =
strlen(p2);
我们会发现:
error C2664:
“strlen”: 不能将参数1 从“wchar_t *”转换为“const char *”
原因是wchar_t实际为uint类型,strlen接受的类型为char,这就出现了上面的问题。
当然,为了支持Unicode,char.h中重写了一些字符串库函数,对于strlen,其新函数名为wcslen(wide-character
string length),使用如下:
wchar_t *p2
= “Unicode\n”;
iLength =
wcslen(p2);
iLength的结果为Unicode\n字符串的长度8。
为了在ASCII和Unicode中统一表示,字符串库函数在char.h中进行了通用的命名,比如char类型统一为TCHAR也就是,如果定义了_UNICODE标识符(Unicode编码),那么TCHAR就被翻译为wchar_t,否则,就被定义为char。再比如,_tcslen函数,如果定义了_UNICODE标识符,那么就被翻译为wcslen,否则就被翻译为strlen函数。
对于字符L的解决,通过_T(或者__T或者_TEXT)来完成,如果定义了_UNICODE标识符,那么,定义:
#define
_T(x) L##x;
这句话的意思就是将L字符黏贴到x前面。“##”为粘贴符号(token paste)。
如果没有定义_UNICODE,那么,宏定义格式就为:
#define
_T(x) x;
那么,统一版本的字符变量声明就为:
TCHAR *P =
_TEXT(“WHAT\n”);