宽字符介绍
⼀.宽字符介绍
⾸先说,什么是ASCII,ASCII是⽤来表⽰英⽂字符的⼀种编码规范。每个ASCII字符占⽤1个字节,因此,ASCII编码可以表⽰的最⼤字符数是255(00H—FFH)。
其实,英⽂字符并没有那么多,⼀般只⽤前128个(00H—7FH,最⾼位为0),其中包括了控制字符、数字、⼤⼩写字母和其它⼀些符号。⽽最⾼位 为1的另128个字符(80H—FFH)被称为“扩展ASCII”,⼀般⽤来存放英⽂的制表符、部分⾳标字符等等的⼀些其它符号。
也就是说char a_char[]="Hello";
这⾥的a_char的每个字符占⼀个字节,也就是8bit的空间,当然,由于是C风格字符串,末尾还有'/0',sizeof的结果为6字节。这就是ASCII编码。
char a_char[]="你好hi";
这个时候cout<<sizeof(a_char)<<endl;结果是7,也就是会所每个汉字占2个字节,⽽每个英⽂字符只占⼀个字节,并且有⼀个'/0'结尾,这就是ASCII编码。
那什么是宽字符呢?那得先看什么是Unicode.
Unicode也是⼀种字符编码⽅法,它占⽤两个字节(0000H—FFFFH),容纳65536个字符,这完全可以容纳全世界所有语⾔⽂字的编码。
在Unicode⾥,所有的字符被⼀视同仁,汉字不再使⽤“两个扩展ASCII”,⽽是使⽤“1个Unicode”,也就是说,所有的⽂字都按⼀个字符来处理,它们都有⼀个唯⼀的Unicode码。
下⾯例举⼏个字符的编码以简单演⽰ANSI和Unicode的区别:
字符 A N 和
ANSII码 41H 4eH cdbaH
Unicode码 0041H 004eH 548cH
看完我上⾯所说的,相信这⾥的编码你不难理解了。
什么是宽字符:对宽字符的⽀持其实是ANSI C标准的⼀部分,⽤以⽀持多字节表⽰⼀个字符。宽字符和Unicode并不完全等同,Unicode 只是宽字符的⼀种编码⽅式。
1、宽字符的定义
在ANSI中,⼀个字符(char)的长度为⼀个字节(Byte)。使⽤Unicode时,⼀个字符占据⼀个字,C++在wchar.h头⽂件中定义了最基本的宽字符类型wchar_t:
typedef unsigned short wchar_t;
从这⾥我们可以清楚地看到,所谓的宽字符就是⽆符号短整数。
unicode码和ascii码区别2.宽字符的使⽤
这个很简单,wchar_t *str1=L" 你好Hello";
这个L⾮常重要,只有带上它,编译器才知道你要将字符串存成⼀个字符⼀个字。还要注意,在L和字符串之间不能有空格。
3、宽字符串库函数
为了操作宽字符串,C++专门定义了⼀套函数,⽐如求宽字符串长度的函数是
size_t __cdel wchlen(const wchar_t*);
为什么要专门定义这些函数呢?最根本的原因是,ANSI 下的字符串都是以’/0’来标识字符串尾的(Unicode字符串以“/0/0”结束),许多字符串函数的正确操作均是以此为基础进⾏。⽽我们知道,在宽 字符的情况下,⼀个字符在内存中要占据⼀个字的空间,这就会使操作ANSI字符的字符串函数⽆法正确操作。以”Hello”字符串为例,在宽字符下,它的 五个字符是:
0x0048 0x0065 0x006c 0x006c 0x006f
在内存中,实际的排列是:
48 00 65 00 6c 00 6c 00 6f 00
于是,ANSI字符串函数,如strlen,在碰到第⼀个48后的00时,就会认为字符串到尾了,⽤strlen对宽字符串求长度的结果就永远会是1!
⼆.宽字符与ASCII的转换
⽐较多的是⽤Windows的API,MultiByteToWideChar 跟WideCharToMultiByte 来实现宽字符跟ASCII之间的转换。
看这段代码.
[cpp:collapse]
上⾯这段代码可以实现从宽字符转为ASCII字符。
[cpp:collapse]
上⾯这段代码可以实现从ASCII字符转为宽字符。
⾄此,⼤家应该对宽字符Unicode跟ASCII多字节编码有⼤体认识了吧。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论