ASCII:
全称为:American Standard Code for Information Interchange(美国信息交换标准代码)
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(即值为0和1),而定义具体用哪些二进制数字表示哪个符号的规则就叫编码,ASCII编码就是其中的一种,ASCII码涵盖了所有的大写和小写字母,数字0 到9,标点符号,以及在美式英语中使用的特殊控制字符,对照关系见图1和图2。
从图1和图2中,可以看到ASCII有256个字符(0-255),而在二进制中,8位二进制0000 0000 - 1111 1111正好代表0-255。在计算机中,8bit=1Byte,所以说存储每个ASCII码占用的空间为1字节,因此ASCII是一种标准的单字节字符编码。
图1
图2
GB2312:
从图1和图2中,可以看到ASCII编码所能代表的字符实在是太少,这就意味着其他国家语言的文字,是无法通过ASCII表示的。为了能表示中文字符,我国在ASCII编码的基础上,扩展出了GB2312编码,但是GB2312编码仅收录了大陆普遍使用的简体字字符: 汉字6763个,符号715个,总计7478个字符,存储空间占用2字节。
Big-5:
GB2312仅仅收录了简体中文相关的字符,而台湾、香港等地依然在使用繁体中文。为了解决这个问题,台湾则在ASCII编码的基础上扩展出了Big-5编码,中文名大五码,是台湾繁体字的字符集,收录13060个繁体汉字,808个符号,总计13868个字符,存储空间占用2字节。Big-5与GB2312由于编码格式不同,所以相互之间不兼容。
GBK1.0:
前面提到的GB2312及Big-5编码虽然都是表示中文,但各自所能表示的中文字符依然有限,因此诞生了一种新的字符集编码:GKB1.0。GBK1.0收录了21003个汉字,882个符号,共计21885个字符,包括了中日韩(CJK)统一汉字20902个、扩展A集(CJK Ext-A) 中的汉字52个,存储空间占用2字节。
GBK1.0包含了Big-5中的繁体字,但是编码格式与Big-5不一样,所以仅仅是包含了Big-5的字符,因此GBK1.0与Big-5是不兼容的,但是兼容GB2312。
GB18030:
GB18030是在GBK1.0基础上扩展的字符集编码(兼容GBK1.0),收录了GBK字符集和CJK Ext-A 全部6582个汉字,共计27533个汉字,是包含了我国少数民族文字(如藏、蒙古、傣、彝、朝鲜、维吾尔文等)的超大型中文编码字符集,采用1-4字节变长字节码存储,是目前汉字编码的标准码。
Unicode:
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。
全世界各个国家都可以在ASCII编码的基础上扩展出包含本国字符的编码,基于这种前提下,难免会出现编码冲突或者不兼容的情况,为了统一所有文字的编码,Unicode应运而生,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode用2字节表示一个字符,这意味着原有的英文编码(ASCII)从单字节变成双字节,只需要把高字节全部填为0就可以,即Unicode兼容ASCII,但并不兼容GB18030。
UTF-8:
Unicode编码虽然统一了各种语言的字符,但是其每个字符的存储空间都需要2字节,而在使用ASCII编码就能完美解决问题的系统中,改用Unicode编码则意味着需要翻倍的存储空间,为此,诞生了一种针对Unicode的可变长度字符编码:UTF-8。目前世界流行的通用编码就是UTF-8。
UTF-8是对Unicode编码的压缩和优化,但是他并不兼容Unicode。UTF-8不再像Unicode那样使用2字节存储字符,而是将所有的字符和符号进行分类:
1、ASCII中的字符使用1个字节存储
2、欧洲的字符使用2个字节存储(如德语等)
3、东亚的字符使用3个字节存储(中文字符包含在其中)
4、其他字符使用4字节存储
乱码的问题:
与字符相关的操作有存储和显示两种,从上述编码的介绍中可以看到,字符编码之间存在不兼容的情况,当存储字符使用的编码与显示字符使用的编码不一致或者不兼容的时候,就会出现乱码。 这就是乱码的根源,所以解决乱码的办法非常简单,只需要更改显示端的字符集编码,使之与存储所用的字符集编码一致或者兼容,即可正常显示内容。
原文地址:https://www.cnblogs.com/broadway/p/11406652.html