工作中经常出现中文字符乱码的问题,以及ASCII、ISO-8859-1、gb2312、GBK、unicode、utf-8、utf-16。。。编码到底是什么意思,为什么要编码?
因为计算机中能识别的只有0、1,所以要将各种字符变成01的格式,编码就是字符与数字的一种对应关系。
ACSII编码:
计算机最早出现在美国,26个字母大小写、数字、回车换行等符号,就用一个字节就可以搞定了,而且只用了一个字节的前七位,也就是128个字符,最高位恒为0。
ISO-8859-1:
随着计算机的推广,各个国家不同的语言对字符编码提出了新的要求,原来的128个字符已经不够用了,人们就将ASCII码的最高的一位利用了起来,扩充成了256个字符,也就出现了ISO-8859-1编码方式,它是兼容ASCII码的。
GBK:
当计算机来到中国的时候,问题又来了,256个字符完全不够用,中国的常用汉字就有6000多个,加上一些不常用的有20000多个,人们就通过增加字节的方式来对汉字进行编码,也就是从一个字节扩充到两个字节,这就是gb2312编码;后来又对gb2312进行了扩充,形成了GBK编码方式,这种方式是兼容gb2312的。
Unicode:
于是这样每个国家都搞出了一套自己的编码方案,各个方案之间互不兼容,无法进行沟通。于是国际标准化组织就搞了一个全球统一的unicode编码方案,它有多个版本,目前常用的是两个字节的编码方案。
UTF-8、UTF-16:
既然unicode已经解决了编码国际化的问题,那我们常听说的utf-8、utf-16又是什么东西,它们是用来解决什么问题的?
编码只是字符与数字的一种对应关系,unicode码是这样的一种对应关系,但是它并没有涉及到存储以及传输的问题。存储的时候哪个字节在前哪个字节在后?网络传输时又是先传输哪个字节?读取文件时计算机如何判断两个字节是两个ASCII码还是一个Unicode码?
因此需要一种统一的存储和传输格式来表示Unicode码,这种统一的实现方式称为UTF(unicode transformation format)。UTF-16与Unicode码完全对应,但是如果一片英文文章用UTF-16来存储的话,对空间造成了很大的浪费;于是UTF-8诞生了,它是一种变长的编码方式,根据不同的Unicode码采用不同的字节长度,减少了资源的浪费。
乱码问题:
1、根操作系统相关,文件的保存类型
2、不同的项目采用了不同的编码格式
3、在头部声明编码类型,保存时用了另外的编码格式
4、网络传输乱码,客户端与服务端请求与接收时的编码格式不一致
所有的乱码问题都是编码和解码的格式不一致造成的,但是由于一次操作往往涉及到多次编解码,所以出现乱码有时很难查找是哪个环节出了问题,所以就要跟代码进行debug。