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

本文详细介绍了字符编码的不同类型,包括ASCII, GBK, Unicode(UTF-16, UTF-8)以及它们的特性。重点讨论了UTF-8的优势,如兼容ASCII且在网络传输中节省带宽。同时,解释了BOM的作用和乱码产生的原因。最后,探讨了编码的兼容性和乱码的可逆性问题。
摘要由CSDN通过智能技术生成

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

二、编码

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值