一.多字节字符与宽字节字符
在介绍多字符之前,向大家介绍ASCII编码,这里给出ASCII编码对照表(完整版)。ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。其中最后一位用于奇偶校验。
ASCII码存在的问题: 我们在使用ASCII表的时候,通常会出现乱码的问题,因为ASCII码只有256个字符,我们在使用ASCII码判断内容的时候,通常会出现误差。
类似于ASCII码的一张全是中文汉字的表: GB2312-80码。
UNICODE编码:
在前面我们提到了,在使用ASCII码的时候通常会出现各种各样的问题,那么有没有什么解决方法呢?这里就要给出我们的UNICODE表,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。
多字节字符:在C语言和C++语言中,char表示多字节字符,我们知道char在内存中占据一个字节,那为什么叫做多字节字符呢?这是因为当要表示一个字时,他可能占用一个字节,也有可能占据好几个字节,比如说当表示中文的时候
其实当使用多字节的时候,编译器对应的是ASCII码表,在ASCII表中查找对应的字符。
宽字节字符:在C++中,wchar_t表示宽字节字符,当他表示一个字的时候,只能是两个字节
当使用宽字节的时候,编译器查找的是UNICODE表,我们前面介绍了,UNICODE表中每个字符都是两个字节(除了特殊情况)。
1.宽字符的使用示例
接下来我们通过示例来看看多字节和宽字节:
#include <stdio.h> int main() { char x = '中'; wchar_t x1 = L'中'; printf("%s\n", &x); wprintf(L"%s\n", &x1); }
我们来到内存窗口查看:
我们可以到ASCII编码表和Unicode表中查看,字符“中”在ASCII表中对应的十六进制编号为0xD0D6,在Unicode编码表中对应的十六进制编号为0x4E2D,而在我们的内存窗口中我们可以看到,以ASCII码的形式存储到内存的时候,只存储了低位一字节,而以Unicode码存储的时候,两个字节完整地存储到了内存中。
2.如何使用宽字符和多字节
我们上文已经介绍过,char类型为多字节,wchar_t类型为宽字符类型,我们来通过示例看看:
#include <stdio.h> int main() { char x[] = "中国"; wchar_t x1[] = L"中国"; printf("%s\n", &x); wprintf(L"%s\n", &x1); }
我们来到局部变量窗口看看:
我们可以看到,多字节是以00
结尾,而宽字符是以00 00
结尾的。
3.控制台打印
那么宽字节和多字符在控制台如何打印呢?
多字节使用printf("%s\n",x);
,宽字符使用wprintf(L"%s\n",x1);
那么在上文中我们多次使用大写的” L “,那么它代表什么意思呢?这里编译器默认的是使用ASCII表来查找字符,我们使用” L “就是告诉编译器,使用Unicode码,这时候编译器就会使用Unicode表来替我们查找字符了。
二.如何告诉编译器在控制台打印简体中文
我们知道,Unicode表中记录了很多国家的文字,那么我们如何告诉编译器,在控制台打印的时候打印简体中文呢?
我们需要加入预编译:#include <locale.h>
在程序中加入:setlocale(LC_ALL,"");
这个函数,这个函数就是告诉控制台:使用控制台默认的编码,我们在该函数第二个参数中为传入值,这时候就会使用操作系统中的地域,比如你的操作系统为中国,那么它就会设置为简体中文。
#include <stdio.h> #include <locale.h> int main() { setlocale(LC_ALL, ""); char x[] = "中国"; wchar_t x1[] = L"中国"; printf("%s\n", &x); wprintf(L"%s\n", &x1); }
这样一番操作下来之后,我们在控制台就可以正确地打印了: