想必大家都听说过:“在电脑的眼中一切都是0和1组成的二进制数字”,那么大家又没有想过像“abcd你我他”这样的字母或者汉字这些字符在电脑眼里是什么样的呢?
前面的这句话不假,在电脑眼中一切都是由0和1组成的二进制数字,字母和汉字也是一样,他们在电脑眼里也都是二进制数字。那么计算机是怎么知道某个二进制数字究竟是哪个字母或者汉字的呢?
想必大家都有身份证,也都有身份证号吧?每个身份证号都与一个人有确定的对应关系,通过身份证号可以准确的区分每一个人。对计算机来说也是如此,每个字符在电脑里都有自己的“身份证号”,通过这个“身份证号”电脑可以识别和管理这些字符。当然,在电脑眼里,这些“身份证号”都是二进制的数字。
这些二进制数字就是字符所对应的字符编码。
一个字符在计算机里对应的二进制编码并不是固定的,会受到编码方式的影响,一个字符经过不同的编码方式编码后得到的二进制数字很可能并不一样。就好像在学校上学时,学校会给我们一个学号,这个学号就是用学校的方式给我们进行编码编号。而我们的身份证号则是用另一种方式给我们进行编码编号,这两种编码方式并不相同,所以得到的号码也都不一样,但都对应具体的某个人。
字符编码也是一样,一个字符通过不同的编码方式编码,得到的二进制数字也许会不一样,但都能表示同一个字符。就比如“我”这个字符,使用UTF-8的方式进行编码得到的二进制数字是“111001101000100010010001”,而使用GB18030编码出的二进制数为“1100111011010010”。虽然这两串数字并不相同,但在各自的编码里都表示着“我”这个汉字。
反过来说,虽然两串数字并不相同,但是计算机通过使用对应的UTF-8和GB18030编码方式可以将这两串数字识别成同一个汉字——“我”。
那么问题来了,如果一个字符通过一种编码方式编码成二进制数字,再通过通过另一种编码方式对这个二进制数进行识别会发生什么呢?
答案是极有可能会识别错误,可能根本识别不出这个字符,或者把这个字符错误的识别成了其他的字符,除非这个字符经过两种编码方式编码后的二进制数是一样的。就好像你去使用身份证号的系统里查找你在学校里的学号一样,极有可能查不到这个人,又或者会查找到某个身份证号和你的学号一样的人。除非你的身份证号和学号是一样的,否则不可能查找到你自己。
同样的,如果一篇文章是通过一种编码方式进行编码的,但是计算机在识别的时候却用其他的编码方式进行识别,这个时候计算机很可能会把文章识别错误,最后展示在电脑屏幕上的文章会出现各种错误的字符和奇怪的符号,从而影响阅读,这就是文章乱码问题的原因。