在小型计算机开发的初期,就已经严格地建立了8位字节最多表示256个字符,但是中国日本和韩国的象形文字符号大约有约21000个,ASCII是无法表示的,因此提出了双字节字符集DBCS(double-byte character set),它从256开始,只有为日文,简体中文,韩语,繁体中文提供的windows版本才支持DBCS,双字符集并不是说字符由两个字节代表,有些字符还是由一个字节表示的,这会引起附加的程序设计问题.
Unicode是更好的解决方案,Unicode是统一的16位系统,足以表示世界上所有的语言文字,它的前128个字符也正好对应着ASCII字符,缺点在于占用两倍的内存。
宽字符是用与C语言支持多字节:
char数据形态
char c = 'a';//8
char *p = "hello!";
宽字符
typdef unsigned short wchar_t;//16
wchar_t c = 'A';在内存中是:0x41 0x00的形式
wchar_t *p = L"Hello!";sizeof(p) = 14
宽字符链接库函数的不同
char *pc = "hello!";
int len = strlen(pc);
我们得到len值为6,没有任何问题,
但是:
wchar_t * pw = L"hello!";
int lenw = strlen(pw);
我们将得到:
'function' : incompatible types - from 'unsigned short *' to 'const char *'
这样的警告或错误提示,因为strlen函数的参数指示要传入char类型,却传入了unsigned int 类型
事实上这种情况还存在于很多地方,不过不用担心宽字符版本的函数别人已经为我们写好了
如:
size_t _cdecl strlen(const char*);
宽字符版本:
size_t _cdecl wcslen(const wchar_t*);
需要注意的是sizeof 得到字符数组的长度时请像这样:
char szc[]="abcdef";
wchar_t szw[] = "abcdef";
int sizec = sizeof(szc)/sizeof(char);
int sizew = sizeof(szw)/sizeof(w_char);
不用切换的方案:
TCHAR
#ifndef _UNICODE
typedef char TCHAR
#define _tcslen strlen
#else
typedef wchar_t TCHAR
#define _tcslen wcslen
#endif
这些工作也是做好了的,只等我们用了