浅谈ASCII 、ISO8859-1、GB2312、GBK、Unicode、UTF-8 的区别。
首先,先科普一下什么是字符编码。字符是指一种语言中使用的基本实体,比如英文中的26个英文字母,标点符号,以及中文中的一个个汉字,都可以算做一个字符。而字符编码旨在将这些字符正确录入计算机中,转换成0101形式的计算机识别码,严格意义来讲字符编码其实是一种规范。遵守这种规范的录入编码,会在编码解码中获取正确的表示,不会出现乱码。
ASCII:计算机发明自美国,自然最初的字符编码规范是以英文为基础的。录入英文字符编码标准:ASCII(American Stardard Code for Information InterChange 美国信息互换标准代码),单字节编码,使用单字节8位 前127个存储英文字母及标点符号。
ISO8859-1:iso组织在ASCII基础上做的扩展,也是单字节编码。
GB2313:随着发展,各国都需要使用各国的语言使用计算机,相应的,我国大陆地区采用双字节 高低位字节的方式,存储简体中文。当存储中文字符时,高低位都存放大于127的数字,当读取高位字节时,若大于127,则认为是中文字符,将读取双字节进行识别,若小于127,则认为是英文字符,单字节识别。另外,GB2313在大于127位的编码库也提供了中文符号的编码,故英文标点符号称做半角符号,中文标点符号称作全角符号。
GBK:对GB2313的拓展,双字节编码,区别是当存储中文字符时,高位存放大于127的数字,低位不再是大于127的数字,将127之前的数字也囊括了。GBK将繁体中文也囊括进来。
Unicode:针对各个国家都使用不同的编码机制,iso组织又站了出来,对全球编码做了整个的囊括,推出了Unicode。Unicode,双字节编码,对ASCII采取高位补零的方式拓展。
UTF-8:由于Unicode是一组编码映射,即一个字符映射一个16进制数字的形式。随着互联网发展,为了节省资源(无论是硬盘存储还是流量),相应的对Unicode进行了不同的实现,这就是utf-8。UTF-8的编码规则及详细的映射Unicode详见另一篇文章: Unicode 和 UTF-8 有何区别 :https://blog.csdn.net/u013314786/article/details/50979627
最后,严格意义来讲,编码之间无法转码,只有使用正确的编码规范才能不出现乱码的问题。统一编码规范,开发时文件创建、代码使用什么编码,并标识文件编码格式,访问时根据不同的编码格式,使用对应编码才是王道。遇到编码问题,从应用程序代码编码设置、jsp页面编码设置、应用部署服务器编码设置、应用部署环境系统编码设置、浏览器编码设置等这些方面入手,查找是哪一环节的编码设置错误。