字符集和字符编码
在工作中经常会遇到乱码问题,很多人对此一直都无从入手,因为大家对字符编码这方面没有很好的深入去了解,只是大概的知道有utf-8、unicode、GBK等字符编码方式。下面我就将我对字符编码的理解来跟大家分享下。
计算机存储信息都是采用二进制来存储信息的,也就是0和1,比如1100001。但是如果计算机在显示屏中也显示二进制的话,我们人类是很难理解的,比如在你的显示屏中直接显示1100001,那你是很难理解计算机要给你展示的信息是什么的。同样的道理,如果你在键盘上打了一个a字母,计算机就会存储这个a字母,但是前面说到计算机只能识别二进制,也就是说计算机只能识别0和1。想要让计算机能存储这个a字母,就需要把这个a字母转换成二进制的形式。可是该把a转换成什么样的二进制呢?通俗点说就是a该转换成什么样的0和1的组合?如果大家不好理解,可以这么想。我们人类是中国人,计算机是英国人。中国人说中文,英国人说英文,所有两者是无法沟通的。想要让一个中国人和一个英国人沟通起来,就需要把中国人说的中文转换成英国人说的英文,把英国人说的英文转成中国人说的中文。想要实现转换就需要两个条件,一个是单词表,里面有每个中英文的对应。一个是翻译的人,根据单词表,根据他学习的翻译规则,然后由这个人转换中英文。同样的道理,人类和计算机语言之间的转换也需要两个条件,一个是字符集,一个是字符编码,分别对应的就是单词表和翻译的人。
人们经常提到的Unicode,就是一种字符集。而utf-8就是基于Unicode这种字符集的一种编码方式,基于Unicode的编码方式还有utf-16、utf-32。还有人们经常见到的ASCII也是一种字符集,同时也是一种编码方式,也就是说ASCII代表了字符集和编码方式,不单单指字符集或者编码方式。
如果大家通过上面的中国人和英国人的例子,理解了字符集和字符编码的关系,也理解了Unicode和utf-8和ASCII的关系。可能会出现一个疑惑,那就是为什么会出现这么多字符集?这主要是因为每个国家的语言都不一样,像ASCII这个字符集,就只收录了英文字符,中文字符就没有收录。用ASCII就无法编码,也无法解码中文字符。为了解决每个国家语言字符不一样这个问题,于是就出现了Unicode,在Unicode里面收录了全球大部分的字符,采用Unicode这个字符集就能再这个互联网时代很好的沟通交流。