

 ✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛)
 🌈 个人Motto:他强任他强,清风拂山冈!
 🔥 所属专栏:C++深入学习笔记
 💫 欢迎来到我的学习笔记!

一、什么编码?
- 编码:人类文字信息是有各种各样的符号组成的, 但是他们却不能直接在内存中存储。计算机内存里面只存储二进制信息
0、1。无符号整型:0 ~ 255共256个收据;有符号整型:-128 ~ 127。那么内存中如何表示符号? 
二、各种编码方式
2.1 ASCII编码表
- 这里就有了编码:一个值对应一个符号。比如说英美人为了表示出他们的文字,就创造出了
ASCII编码表,主要就是为了表示出他们自己的文字、常见符号等一共128个字符。
 
int main()
{
    char buff[] = "apple sort";
    // 在内存里面存储的是值和符号的映射关系
    // 内存里面存储的其实是
    return 0;
}
 
- 我们在监视窗口可以看见内存里面存储的内容:就是字符对应的ASCII码值。**ASCII编码表的本质:字符和值的映射。**打印输出的过程相当于是一个查编码表的过程。
 - 内存里面存储的是值,对我们显示的是符号。
 
2.2 万国码
- 前面的ASCII码表没有其他国家的特殊字符,因此我们推出了万国码(
Unicode),也叫做统一码、单一码,编译了各个国家的文字符号! - 万国码不断地发展改进和完善,现在主要有
UTF-8、UTF-16、UTF-32等,UTF-8是一种变长编码,可以兼容ASCII编码,比较常用。只使用了0~127,所以可以认为是无符号类型的。几个字节对应一个符号,例如常见汉字也是使用2个字节来存储的。 UTF-8的编码格式(一种变长编码):(简单了解即可)一个值对应一个符号
| 字节 | 格式 | 实际编码位 | 码点范围 | 
|---|---|---|---|
| 1字节 | 0xxxxxxx(ASCII编码) | 7 | 0~127 | 
| 2字节 | 110xxxxx 10xxxxxx | 11 | 128~2047 | 
| 3字节 | 1110xxxx 10xxxxxx 10xxxxxx | 16 | 2048~65535 | 
| 4字节 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 21 | 65536~2097151 | 
UTF-16两个字节为一个单位。UTF-32就是以4字节为一个单位,但是会比较浪费空间。
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
int main()
{
	char str[] = "牛马";			// 1个字节为一个单位
	char16_t str16[] = u"泥嚎"; 	// 2字节为一个单位
	char32_t str32[] = U"再见";		// 
	cout << sizeof(str) << endl;    // 5
	cout << sizeof(str16) << endl;  // 6
	cout << sizeof(str32) << endl;  // 12
	return 0;
}
 
- 根据下面的代码可以发现:万国码中的汉字是按照同音字进行存储的。(相当于是按照拼音存储的)
 
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
int main()
{
	char str[] = "泥嚎";
	cout << strlen(str) << endl;
	str[0]++;
	cout << str << endl;
	str[1]--;
	cout << str << endl;
	str[2]++;
	cout << str << endl;
	str[3]--;
	cout << str << endl;
	return 0;
}
 
- 底层对应的值变化了,在表里面查询到的符号就变了,更加说明了值和符号之间的映射关系。
UTF-8就比较结合能空间,有些字符1个字节就够了。 - 这就是为什么
string需要实现为模板:默认string支持UTF-8,在文档中就有说明的。 string里面也提供了16、32的字符:char16_t(数据前面加一个u前缀)、char32_t(数据前面加一个U前缀,)等等。

宽字符:不确定大小长度的,就像long一样,在不同平台下的大小不一样。主要用来存储UTF-16。

char str[] = "牛马";			// UTF-8是以1个字节为一个单位:一个汉字2字节,2个汉字4字节加一个\0,一共5字节
char16_t str16[] = u"泥嚎"; 	// 2字节为一个单位2 + 2 + 2 = 6,\0也是2字节 
char32_t str32[] = U"再见";		// 4字节为一个单位4 + 4 + 4 = 12
wchar wstr[] = L"泥嚎";
cout << sizeof(str) << endl;    // 5
cout << sizeof(str16) << endl;  // 6
cout << sizeof(str32) << endl;  // 12
cout << sizeof(wstr) << endl;   // 
 
2.3 GBK编码
- GBK编码:我国自己的编码。GB+数字:都是这一系列的。它包括了汉字(包括中国台湾省的繁体、民族字体文字、古代文字、生僻字……)、韩语、日语(中日韩)。
Windows也是用的GBK编码。 
三、ASCII编码详解
3.1.ASCII码的诞生
ASCII码开发始于1960年,由美国标准协会(ASA,现ANSI)技术委员会X3负责指定。最初的目的是为了一致地处理文本数据,解决当时不同计算机系统间数据交换不变的问题。
3.2.数字字符
| ASCII码值 | 字符 | 描述 | 
|---|---|---|
| 48 | ‘0’ | 数字0 | 
| 49 | ‘1’ | 数字1 | 
| 50 | ‘2’ | 数字2 | 
| 51 | ‘3’ | 数字3 | 
| 52 | ‘4’ | 数字4 | 
| 53 | ‘5’ | 数字5 | 
| 54 | ‘6’ | 数字6 | 
| 55 | ‘7’ | 数字7 | 
| 56 | '8 | 数字8 | 
| 57 | ‘9’ | 数字9 | 
3.3.可打印字符
3.3.1.空格字符和标点符号
| ASCII码值 | 字符 | 描述 | 
|---|---|---|
| 32 | (空格) | 空格 | 
| 33 | ! | 感叹号 | 
| 34 | ” | 双引号 | 
| 35 | # | 井号 | 
| 36 | $ | 美元符号(英文字符) | 
| 37 | % | 百分号 | 
| 38 | & | 和号 | 
| 39 | ’ | 单引号 | 
| 40 | ( | 做括号 | 
| 41 | ) | 右括号 | 
| 42 | * | 星号 | 
| 43 | + | 加号 | 
| 44 | , | 逗号 | 
| 45 | - | 减号 | 
| 46 | . | 句号 | 
| 47 | / | 斜杠 | 
3.3.2.数字
| ASCII码值 | 字符 | 描述 | 
|---|---|---|
| 48 | 0 | 数字0 | 
| 49 | 1 | 数字1 | 
| 50 | 2 | 数字2 | 
| 51 | 3 | 数字3 | 
| 52 | 4 | 数字4 | 
| 53 | 5 | 数字5 | 
| 54 | 6 | 数字6 | 
| 55 | 7 | 数字7 | 
| 56 | 8 | 数字8 | 
| 57 | 9 | 数字9 | 
3.3.3.大写字母
| ASCII码值 | 字符 | 描述 | 
|---|---|---|
| 65 | A | 大写字母 A | 
| 66 | B | 大写字母 B | 
| 67 | C | 大写字母 C | 
| 68 | D | 大写字母 D | 
| 69 | E | 大写字母 E | 
| 70 | F | 大写字母 F | 
| 71 | G | 大写字母 G | 
| 72 | H | 大写字母 H | 
| 73 | I | 大写字母 I | 
| 74 | J | 大写字母 J | 
| 75 | K | 大写字母 K | 
| 76 | L | 大写字母 L | 
| 77 | M | 大写字母 M | 
| 78 | N | 大写字母 N | 
| 79 | O | 大写字母 O | 
| 80 | P | 大写字母 P | 
| 81 | Q | 大写字母 Q | 
| 82 | R | 大写字母 R | 
| 83 | S | 大写字母 S | 
| 84 | T | 大写字母 T | 
| 85 | U | 大写字母 U | 
| 86 | V | 大写字母 V | 
| 87 | W | 大写字母 W | 
| 88 | X | 大写字母 X | 
| 89 | Y | 大写字母 Y | 
| 90 | Z | 大写字母 Z | 
3.3.4.小写字母
| ASCII码值 | 字符 | 描述 | 
|---|---|---|
| 97 | a | 小写字母a | 
| 98 | b | 小写字母b | 
| 99 | c | 小写字母c | 
| 100 | d | 小写字母d | 
| 101 | e | 小写字母e | 
| 102 | f | 小写字母f | 
| 103 | g | 小写字母g | 
| 104 | h | 小写字母h | 
| 105 | i | 小写字母i | 
| 106 | j | 小写字母j | 
| 107 | k | 小写字母k | 
| 108 | l | 小写字母l | 
| 109 | m | 小写字母m | 
| 110 | n | 小写字母n | 
| 111 | o | 小写字母o | 
| 112 | p | 小写字母p | 
| 113 | q | 小写字母q | 
| 114 | r | 小写字母r | 
| 115 | s | 小写字母s | 
| 116 | t | 小写字母t | 
| 117 | u | 小写字母u | 
| 118 | v | 小写字母v | 
| 119 | w | 小写字母w | 
| 120 | x | 小写字母x | 
| 121 | y | 小写字母y | 
| 122 | z | 小写字母z | 




















