先看图片:
图片:
VC里字符编码是用MBCS(Multi-Byte Chactacter System),char类型实际上就是一个8bit的空间(与int类型相同,故有时候类型通用),中文字符“个”在VC里占用2个char的空间,即2字节,s1指向的内存上的数据为(10111000,11110110),如果用十进制表示即为(184,246),十六进制即为(0xB8,0xF6)。
对于MBCS,一个字符占用的空间不是固定长度,如果是ASCII码则是8bit,GBK汉字则是16bit。
ASCII码的范围用十进制表示是 [0,127],单字节字符,用来表示英文字符及数字和其他一些符号。
GBK汉字是双字节字符,前8bit范围是[129,254],后8bit范围是 [64,254]。
可以看到中西字符编码是互不交叉的,printf的东西全送进屏幕缓冲区里,程序读取屏幕缓冲区上的“个”的前8bit,也就是184(0xB8),发现其不在单字符码表里(ASCII),就知道这个不是个单字节字符, 所以指针下移,向后再读8bit,读到 246(0xF6),此时两个字节一共16bit,拿去和GBK汉字码表对照,查有此字,就显示出来。
判断是汉字还是字母的方法,当然就是根据该字节对应数值所处范围来判断是单字节字符(字母/数字/其他半角/通信符号),还是双字节字符(如中日韩文字)。
我简单写个程序方便大家理解:
#include <stdio.h>
int main(){
char char1 = 184;
char char2 = 246;
printf("Print1:\n");
printf("%c",char1);
printf("\n");
printf("%c", char2);
printf("\n Print2:\n %c%c\n",char1, char2);
printf(" Print3:\n ");
printf("%c",char1);
printf("%c",char2);
return 0;
}
让我们来看一下结果:
所以我们还可以这样玩:
#include <stdio.h>
#include <unistd.h>//VC退散
printf("%c",hexchar[i]);
_sleep(300);
}
return 0;
}