首先,先科普一下什么是字符编码。字符是指一种语言中使用的基本实体,比如英文中的26个英文字母,标点符号,以及中文中的一个个汉字,都可以算做一个字符。我们在计算机屏幕上看到的这些字符,在计算机存储介质中存放的实际是二进制的比特流(…0101…)。
那么在这两者之间的转换就需要一个统一的标准,否则就会出现乱码(mojibake
)。于是为了实现转换标准,各种字符集标准就出现了。简单的说字符编码就是规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系。
-
ASCII:计算机最初是由美国等国家发明的,所以最初的字符编码规范是以英文为基础。录入英文字符编码标准:ASCII(American Stardard Code for Information InterChange 美国信息互换标准代码),单字节编码,使用单字节8位 前127个存储英文字母及标点符号。
-
ISO8859-1 / Latin-1 :ISO(国际标准化组织)在ASCII基础上做的扩展,向下兼容ASCII,也是单字节编码,是许多欧洲国家使用的编码标准。
-
GB2312 :随着发展,各国都需要使用各国的语言使用计算机,相应的,我国大陆地区采用双字节 高低位字节的方式,存储简体中文。当存储中文字符时,高低位都存放大于127的数字,当读取高位字节时,若大于127,则认为是中文字符,将读取双字节进行识别,若小于127,则认为是英文字符,单字节识别。另外,GB2312在大于127位的编码库也提供了中文符号的编码,故英文标点符号称做半角符号,中文标点符号称作全角符号。
-
GBK :对GB2312的拓展,双字节编码,区别是当存储中文字符时,高位存放大于127的数字,低位不再是大于127的数字,将127之前的数字也囊括了。GBK将繁体中文也囊括进来。
-
Unicode :针对各个国家都使用不同的编码机制,iso(国际标准化组织)又站了出来,对全球编码做了整个的囊括,推出了Unicode ,但其字符集也是最复杂、占用空间最大的。
Unicode,定长双字节编码,对ASCII采取高位补零的方式拓展,不兼容iso8859-1编码。
说明: 定长编码便于计算机处理(GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。 -
UTF-8 :由于Unicode是一组编码映射,即一个字符映射一个16进制数字的形式。随着互联网发展,unicode不便于传输和存储,为了节省资源(无论是硬盘存储还是流量),相应的就产生了utf-8编码。
UTF-8兼容ISO8859-1编码,同时也可以用来表示所有语言,不过UTF-8编码是不定长编码,一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节,比 unicode编码节省空间。