ref:
https://www.bilibili.com/video/BV1HJ411E7d3?spm_id_from=333.999.0.0
系列文章目录
文章目录
前言
0和1在计算机中被称为位,即bit 位。
我们规定用8个bit位为一组 来表示计算机的最小存储单元,这个最小的存储单元就是byte字节。8个位,每个位上只能存储0或者1,则byte的存储范围则是 00000000~11111111(换算 成十进制整数为0~255)。
计算机在存储数字的时候,是将数字转为字节进行存储;
在存储字符的时候,如:ABC等。计算机会通过一个编码表,将字符映射成对应的整数,然后进行存储。如:计算机在存储字符A时,会将A映射成整数65对应的二进制进行存储。
一、常见的几种编码表
1.1 ASCII编码表
ASCII,全称“美国信息互换标准代码”,由美国发明,美国根据自己的需求只需要128个字符,因此ASCII码表只规定了这128个字符对应的二进制值 的映射。
使用1个字节范围来表示。
128个字符使用7个bit 位就可以表示完。ASCII中字符的最高位设置为0,用剩下的7位表示不同的字符。7个位的组合的值 0 ~127 就完全刚够表示128个字符。
ascii码表的字符:
值为32-126的这些字符都是可打印字符。值为0~31和127表示一些不可打印的字符,如:换行符、制表符。
char c = 9; // 相当于给c赋值一个 制表符\t
char c = ‘a’;
int a = c – 10 = 55。//即字符类型变量c 可以当作整型值来使用。
1.2 GBK
GBK的编码表中有 中文汉字的映射,而且比较全,有21000个中文。
使用两个字节表示。
1.3 Unicode编号
Unicode
编码将 世界上所有的字符进行了统一,给世界上所有的字符都分配了一个唯一的Unicode编号,这个编号一般写成十六进制,在前面加上
U+
。例如
‘贤’
的Unicode编号是
U+8D24
。
Unicode只做了一件事,就是给所有的字符分配了唯一的编号,但是并没有规定这个编号 怎么对应成二进制表示。这点是不同于其他的编码表的,如ascii等 是直接把字符映射成了了一个二进制值表示。
那么这个字符对应的Unicode编号 是如何转换成二进制表示呢?
有如下多种方案,主要有UTF-8、UTF-16、UTF-32。
这个转换的流程如下图示:
1.4 utf-16
在没有特殊说明的情况下,
unicode编码
就是我们所说的
utf-16
编码。
utf-16常用于系统内部编码,我们常说的unicode编码是2个字节,其实是因为windows系统默认的Unicode码的 转换规则就是utf-16。
因为是2个字节,所以对于美国那些国家 还是有些浪费。
1.5 Utf-8
utf-8使用的是变长字节表示,每个字符的使用字节个数 与字符对应的Unicode编号的大小有关,编号小的使用字节就少,编号大的使用字节就多。字符使用的字节个数从1到4个不等。
注意:
Utf-8与Utf-16/32不同的是 它兼容ascii编码,即前0~127个字符对应的二进制 与ascii一样
。
UTF-8的优势是网络上传输英文只需要1个字节,可以节省带宽资源。因此当前大部分的网络应用都使用utf-8编码。
1.5 BOM
BOM用来指明文件内容的编码方式。
我们通常会看到这样的编码 utf-8 utf-8 bom,那什么是BOM呢?
Unicode标准建议用BOM(Byte Order Mark)来区分字节序。即在传输字节流之前,先传输被作为BOM的字符 “零宽无中断空格”,这个BOM字符在Unicode中都是未定义的码位,所以不应该出现在实际的内容传输中。
假如一个文件内容的编码使用了BOM,那么即使一个文件中一个字符都看不到,那么文件中也是会包含如下三个字节的BOM标识的。
【注意】:
utf-8 是不需要BOM来表明字节顺序的。
只有utf-16/32 才有大小端之分,才需要BOM 来指定编码的标识,在传输内容之前,先传输BOM标识。所以在一段内容的字节流传输之前, 可以根据接收到的以下BOM字节 来得出文本文件的编码。如果不是以BOM标识开头,则程序会以默认编码读取和解析字节流。
windows的中文本地编码都是GBK。
1.6 兼容和乱码的概念
一个字符’A’,若是通过兼容的编码表去解析 和展示,那么还会原封不动的展示为字符‘A’,不会出现乱码。
通过两个 不兼容的编码表去 解析 和 展示字符,会出现乱码。
1.7 乱码的原因和可逆性
二、编码
总结