说到乱码我们首先要讲到编码集。通俗的理解就是我们人类能够识别的符号,而这些符号要保存到计算机的存储中就需要用计算机能够识别的字节来表示。因此我们编写出了字符集(多个字符的集合)并根据一定的方式对其进行编码。
下面介绍几种常见字符集:
ASCII:这也是我们最熟悉最常用的一个字符集
GB2132:
我们上面说了,ASCII 字符集是一种现代美国英语适用的字符集。因此,很多国家都捣鼓了一个适合自己国家语言的字符集。
GB2312 字符集是一种对汉字比较友好的字符集,共收录 6700 多个汉字,基本涵盖了绝大部分常用汉字。不过,GB2312 字符集不支持绝大部分的生僻字和繁体字。
对于英语字符,GB2312 编码和 ASCII 码是相同的,1 字节编码即可。对于非英字符,需要 2 字节编码。两个字节中前面的字节为第一字节,后面的字节为第二字节。习惯上称第一字节为“高字节” ,而称第二字节为“低字节”。“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。
以GB2312字符集的第一个汉字“啊”字为例,它的区号16,位号01,则区位码是1601,在大多数计算机程序中,高字节和低字节分别加0xA0得到程序的汉字处理编码0xB0A1。
GBK:
GBK编码,是对GB2312编码的扩展,因此完全兼容GB2312-80标准。GBK编码依然采用双字节编码方案,其编码范围:8140-FEFE,剔除xx7F码位,共23940个码位。共收录汉字和图形符号21886个,其中汉字(包括部首和构件)21003个,图形符号883个。GBK编码支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年12月15日正式发布,这一版的GBK规范为1.0版。
Unicode:
Unicode 是基于通用字符集(Universal Character Set)的标准来发展,6.1版已发布(2012年1月31日)。Unicode定义了大到足以代表人类所有可读字符的字符集。
编码方式:
UTF-8
UTF-16/32
在计算机中的存储规则
主讲老师:尼古拉斯阿玮
介绍完这些那我们再重新回到为什么会产生乱码的问题上?主要有以下两个原因
(1).在计算机在读取中文时没有读取到完整的汉字,我们已经知道
小拓展:为什么中文转比特时候出现了负数
在讲解之前,先了解机器数、真值、反码、原码、补码的概念
1.机器数
顾名思义就是机器所能识别的数字,也就是我们常说的01代码,在这里我们用最高位来存放符号
正数为0,负数为1。比如,十进制中的数 +3 ,计算机字长位8位,转换成二进制就是00000011。如果是-3就是100000011,真理这里的00000011和100000011就是机器数。机器数原码,补码,反码都是机器数一种表现形式,或说都属于机器数
2.真值
因为在计算机中是带符号为的存储,所以我们所得到的机器数并不是它真正的数值。比如10010011 = +19,并不是直接将机器码的形式值147
3.原码
原码就是符号位加上真值得绝对值,即第一位仍然是符号位,其余的位就表示其余位表示值。
4.反码
正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各位取反
[+1] = [00000001]原 = [00000001]反
[ -1] = [10000001]原 = [11111110]反
5.补码
正数的补码就是其本身。负数的补码是反码+1
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[ -1] = [10000001]原 = [11111110]反+1 = [11111111]
在utf-8中汉字使用3个字节进行存储
经过查询我们知道“汉”的编码为x6C49,转换为十进制就是27721,转换成二进制就是 110 110001 001001,----> 计算机的数据用补码进行存储,在根据UTF-8编码方式(二进制)11100110 10110001 10001001(UTF-8编码) ---> 11100101 10110001 10001000(反码) --->
10011010 11001110 11110111(原码)---> -26,-79, -119(真值)
小彩蛋:111010011000000110010011 111010011001100010111011 111001001011100010010100 111010011001010110111111 111011111011110010001100 111010001010000110001100 111001011000100010011001 111001011011000010000110 111010001000011110110011相关链接https://www.qqxiuzi.cn/bianma/erjinzhi.php
注意:请勾选第二个