DBCS ,宽字符与unicode

来源:互联网 发布:淘宝客服介入后撤销 编辑:程序博客网 时间:2024/04/29 00:44

在小型计算机开发的初期,就已经严格地建立了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

 

这些工作也是做好了的,只等我们用了