前言
对于字符集编码,还有日常中文乱码问题,大家在日常开发中或多或少都遇到过。一般常见的有get请求上的中文乱码,表单提交中文乱码,字符串io传输中文乱码,数据库读写中文乱码等等。。。乱码问题总是困扰着无数程序猿们。而说到乱码问题,以及具体解决乱码问题的前提是,我们要对字符,字符集,字节,编码,解码这些基础概念有清晰的理解。这样在日常开发中遇到的乱码问题也就比较好解决了!看破乱码的表象,去探寻底层的原理,这才是猿们应该做的事,而不是遇到乱码,立马百度,然后crtl+c,ctrl+v。这里和大家一起捡捡这些小芝麻。
常见字符集编码具体介绍
随着互联网的发展,字符集的发展也是与时俱进的,从最初的ASCII到现在逐渐取代ASCII的unicode,这期间还产生了很多其他的字符集和编码格式。下面主要介绍几个在日常开发中比较常见的字符集编码。
在介绍具体的几种字符集编码之前,我们先了解一些基础的概念。
- 字符:人们使用的记号,抽象意义上的一个符号。 例如:¥,*,中,a。
- 字符集:就是字符的集合。
- 字节:数据在计算机中存储的最小单位,由8个二进制来表示。
- 编码:就是规定“字符”由多少个字节保存,具体由哪一个字节保存。
下面具体看看几个比较常见的字符集编码
ASCII编码
早期的ASCII主要是对英语中的字母来进行编码,只需要由7个二进制就可以实现所有的英文字母的编码,一共可以表示128字符。第八位是留给后期拓展的。在早期的英文DOS系统中ASCII字符集已经完全够用了。
ISO-8859-1编码
属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母’a’的编码为0x61=97。
很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍 旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然”中文”两个字不存在iso8859-1编码,以gb2312编码为 例,应该是”d6d0 cec4”两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:”d6 d0 ce c4”。而如果是UTF编码,则是6个字节”e4 b8 ad e6 96 87”。ISO-8859-1可以认为是ASCII的拓展,这里包含了一些西欧字母。
GB2312编码
随着互联网的普及,ISO-8858-1只能在英语使用国家的缺点暴露出来了,对其他国家的字符不支持迫使其他国家制定了属于自己的字符集编码,GB2312就是在这种趋势下诞生的,他里面包含了常用的简体汉字,同时他也是可以兼容ASCII的,所以他是用一个字节来表示英文中的字母,对于汉字他是利用两个字节来进行存储的。当时台湾由于GB2312不支持繁体字,所以自己也搞了一套字符集就是所谓的BIG5,后来又出来了一套GBK字符集编码,这种编码涵盖了大部分的中文汉字,其中包含中文简体和中文繁体。这几种的编码格式,都不是一种定长编码,对于字母是用一个字节来进行保存,对于汉字是用两个字节进行保存。
unicode编码
对于上面的GB2312,GBK都是针对汉字的编码,对于日语还有JIS字符集,这些字符集之间的兼容性很差,导致使用起来还是很麻烦,所以是时候出台一款能兼容世界上大部分语言的统一字符编码了,于是乎,unicode在这关键时刻应用而生。unicode是编码的字符集中所有字符都是由两个字节保存,对于是那些