

✨ 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 |




















