字符集与编码的关系
记得刚开始学习编程的时候,只记得网络传输的就是二进制的数据,要接收的时候要进行编码,但是为什么要进行编码倒是没有去深入的理解,现在重新来理清一下!
首先理解什么是编码,为什么计算机需要编码?
编码是将源对象bai内容按照一种du标准zhi转换为一种标准格式内容。解码是和编码对应的,它使用和编码相同的标准将编码内容还原为最初的对象内容。
而在这里就可以代指字符集合编码规则得到的字节数据之间的映射关系了。
至于为什么有多种编码方式,那得去搜编码的发展历史了。参考:https://blog.csdn.net/csdndn/article/details/79580019
主要是字符集合和编码规则这两个概念:
字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
这下面是我的找到的两者之间的关系,我知道通常的编码像GBK就是即代表字符集又代表编码规则,可以理解为一个汉字就可以映射为特定的字节数据,主要是保存长度的不同。但是里面就出现了个叛徒--unicode
就是这个家伙害得我老是理解编码理解错误了,简单来说unicode代表的是字符集,而utf-8,utf-16,utf-32都是unicode的编码规则。
在Unicode中,每个字符占据一个码位/Unicode 编号(用4位十六进制数表示,Code point:U+ FFFF),字符集中的字符与Unicode 编号一一映射。如U+ 0000为“Null”,U+ 597D="好"。Unicode字符集共定义了1 114 112个这样的位,使用从0到10FFFF的十六进制数唯一地表示世界上几乎所有字符。NCR(Numeric Character Reference),以「&#」开头的后接十进制数字,以「&#x」开头的后接十六进制数字。
由于计算机存储数据通常是以字节为单位的,而且出于兼容之前的ASCII(0x00-0x7F)、节省存储空间等诸多原因,需要一种具体的编码方式来对字符码位进行标识。规定每个字符的Unicode编号如何存储(用一个字节还是多个字节存储,用哪些字节来存储),常见的基于Unicode字符集的编码方式有UTF-8、UTF-16及UTF-32。
同一段二进制,每一个字节一个编号还是每两个字节一个编号,解码方式不一样,得到的编号不一样,对应的映射字符也不同,这就是乱码的原因。
参考链接:
https://blog.csdn.net/humadivinity/article/details/79403625
https://www.cnblogs.com/kevin2chen/p/6424269.html