关于unicode和多字节之间的关系及区别(笔记)

来源:互联网 发布:阿里云短信 regionid 编辑:程序博客网 时间:2024/05/20 07:33

  我们都知道微软采用了两种字符集编码格式,一种是unicode编码;另一种便是多字节编码格式。那他们之间的关系是什么呢?好的,让我们先看下面一段程序:

TCHAR* p = _T("it学吧");
// 多字节字符集
int a = sizeof(p); //===???
int b = _tcslen(p);//===???;
// 在UNICODE字符集下
int c = sizeof(p); //===???
int d = _tcslen(p);//===???

 

这道题已经可以体现unicode和多字节之间有什么区别了。首先呢,_tcslen这个函数在是一个宏定义,定义如下:

#ifdef _UNICODE
#define _tcslen wcslen

#else

#define _tcslen  strlen

#endif

 

上面的表述清楚明了,也就是说:

当没有定义_UNICODE宏时,TCHAR = char,_tcslen = strlen
当定义了_UNICODE宏时,TCHAR = wchar_t , _tcslen = wcslen
 
由于p是指针类型,也即是表述地址的变量,在32位机上为4字节,所以a和c均为4,多字节的意思是字符串中可以是一个字节表示也可以两个字节表示,英文字符一个字节即可,不过汉字需要两个字节(生僻字除外 ),所以在多字节情况下b是6,(i占一个字节,t占一个字节,(“学吧”)两个汉字各占两个字节)字符串结束符号不算,因为只计算有效长度。在unicode环境下,d为4,(因为此时_tcslen为函数wcslen,一次跨步两个字节,也即是一个长度代表两个字节)此时字符串结束标志需要两个'\0'表示,如果不全是两个结束标志,则计算机认为此字符串没有结束,所以此时计算过程为:字母'i'占两个字节,其中前一个为'\o',第二个为其'i',t亦是如此,‘学吧’各自占两个字节,也就是两个长度,所以此时字符串长度为4。由于刚开始写博客,如若有误,敬请指正~~~~~

附:

通常我们说汉字是占用2字节(GB-2312)。
具体依据汉字编码形式有所不同:
GB-231280 编码为 2个字节(Byte) 包含了 20902 个汉字,其编码范围是 0x8140-0xfefe。
GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的字形。编码是变长的,其二字节部分与 GBK 兼容;四字节部分是扩充的字形、字位,其编码范围是首字节 0x81-0xfe、二字节0x30-0x39、三字节 0x81-0xfe、四字节0x30-0x39

原创粉丝点击