2021-10-23-详讲编码与解码,灵活解决乱码难题

  • Post author:
  • Post category:其他


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 乱码的原因和可逆性



二、编码



总结



版权声明:本文为qq_38737586原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。