ASCII、Unicode 、UTF-8学习梳理

一、计算机存储单位

了解编码前先梳理一下计算机的各种存储单位

1、bit(位)

数据存储的最小单位,因为计算机是通过二进制来存储,传输数据的,二进制数据中的一位就是1bit。
很多时候用来表带宽。

2、byte(字节)

8bit = 1byte

4bit能代表一个16进制位,很多流的打印中,会用两个16进制位来表示8个bit也就是1个byte

n(bit)能枚举的量为 2n,n个16进制位能枚举的量为24n,而n(byte)能表示的量为28n

字体编码

1、ASCII码

ASCII码是一套很基础且沿用至今的编码集,一共规定了128个字符的编码,用8个bit也就是一个字节来表示。具体如下
ascii
机器只能识别二进制,有这个表做对照,机器就能通过二进制代码认识相应的文字了。

2、拓展版ASCII码

很多人认为1个字节的可以表示28个量,剩下128个位置为什么不用完呢,然后各方开始想要把剩下的128个位置补完
比如 ibm的拓展ASCII表
ibm的拓展ASCII表
ISO-8859-1
其中包含欧洲各国语言中最常用的非英文字母
在这里插入图片描述
因为当时对额外字符对规范太多了,不同标准端的收发数据都会出现很多不能兼容的符号,而且,这在亚洲根本不能用,成千上万个文字根本不能塞进256个位置里,那咋办嘛。于是出现了Unicode码

3、Unicode编码集

如其名字一样,每个字符都有一个独一无二的编码,因为它用16个bit来表示一个字符,也就是它有216,也就是65,536个可能。

但是65536个还是不够,想想我们有多少中文字,还有日本,印度等等等等,有些可能会用3个甚至4个字节来进行表示,windows系统的可以在html代码中输入&#xxxx;玩玩,mac的话很多字符不支持。具体可以去

https://blog.csdn.net/weixin_42476799/article/details/95057404charCodeAt那部分玩玩看看。
下面还有html自己的转义编码表
在这里插入图片描述
这时候就要问,这不是已经完结了吗,啥都可以做了,但是很多国家,很少用到8个bit也就是一个字节以上的的字符,因为大都只用英文,如果按照Unicode编码规范,就会大大占用内存空间,影响传输效率。

比如在Unicode编码规范下,原本用两个16进制(1byte)6和5就能表示的大写A现在要用四个16进制(2byte)也就是0065来表示,当然不愿意了。浪费一半内存,还浪费传输效率。所以Unicode编码就被放入了冷宫。

这时候utf-8就出现了

4、utf-8编码集

utf-8的好处是能够用1~4个字节来表示字符,对应的编码规范还是Unicode编码,但是在这上面做了自己的规则升级,它可以根据不同字符变化编码的长度,比如说a(#97)就只用一个字节编码,但是“啊”就要用三个字节(#021834),这时候真正大统一了,捡字符便宜的捡到了便宜,想要用上相应国家文字的也用上了相应的文字,虽然占内存大了点,但是没有办法。所以,现在不管是html,还是其他的,大多都会声明成utf-8,因为通用,就不会有很多乱码出现了。

但是很多时候怎么判断是一个字符占用一个字节呢,这就要说到utf-8的规则了,转成二进制后第一位如果是0,则判定为其为一个字节的字符。

对n个字节的的字节的字符,第一个字节的二进制上会有n个1,n+1位上放个0。这就可以判定它是几个字节的字符了。

而“烫烫烫”那种,其实是vscode的内存填充问题,没有初始化的情况下,自动编码成CCDD和CDCD,然后输出就变这样了。