现如今的编程界流行着各种各样的编程语言,JAVASCRIPT、JAVA、PYTHON、C++…在这些编程语言中都存在着一种数据类型,那便是 字符串,由此可见它的重要性,因此对于它的研究肯定也是必不可少的,废话不多说,开搞!
什么是字符集
字符集,从字面意思就可以知道它是 字符的集合,具体的定义为:已编号的字符的有序集合。它为计算机所用到的每一个字符都分配了编号,从而形成一个 映射的关系(编号 => 字符)
字符集其实有很多种,不同的字符集涵盖了不同数量的字符,常见字符集如下
- ASCII字符集(American Standard Code for):这种字符集收录了 128 个字符,编号为 0~127,需要注意的是编号为0~31 和 127 都是不可见字符,用于表达特殊含义,例如编号10对应的就是换行符,ASCII字符集编码图例如下:
- ISO 8859系列字符集: 它们本质上都是ASCII字符集的一个扩展,除了收录的字符有些不一样外,其他的编码方式啥的都是一样的
- GB2312字符集: 收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字 6763 个,其他文字符号 682 个,需要注意的是GB2312字符集并没有收录ASCII字符集中的字符
- GBK和GB18030字符集: GBK字符集就是在GB2312的基础上,对它收录的字符做了一个扩充,共收录 21886 个汉字和图形符号,GB18030字符集在GBK的基础上又做了个扩充,收录汉字 70244 个
- unicode字符集: 收录全世界所有字符,用于统一字符集,一共设计了 17(编号从0~16) 个平面,每个平面可以包含 65536(0~65535) 个编号,其中第 0 个平面是包含了当前世界上最常用的一些字符,所以这第0个平面也叫做 **BMP(Basic Multilingual Plane)**,翻译过来就是 基本多语言平面,简称为 基本平面,编号范围为 0000~FFFF,表示方式为 U+十六进制编号
在了解了字符集的概念后,我们还需要知道另一个重要概念:编码方式,请看下文
什么是编码方式
编码方式说白了就是 规定字符集里的编号如何映射成2进制以及如何将2进制映射回对应的编号,不同的处理方式会产生不同的编码结果,在介绍不同的编码方式之前,我们还需要理解一个重要概念,那就是 码元
在计算机中,处理数据的最小单位是字节,在不同的编码方式中,一次读取的字节数是不一样的,码元便是指 计算机一次读取的字节数
在了解了码元的含义后,我们再来看下一些常见的编码方式
- ASCII编码:使用 ASCII字符集,规定码元为 一个字节,字符集里的所有字符都只占 1个字节
- UTF-8编码:使用 unicode字符集,规定码元为 一个字节,由于一个字节做多表示256个字符,因此对于大部分字符来说需要多个字节来表示,那么是如何让计算机分辨一个字符是单字节还是多字节呢?规则如下:
- 如果首字节以0开头,肯定是单字节编码(单个码元)
- 如果首字节以110开头,肯定是双字节编码(2个码元)
- 如果首字节以1110开头,肯定是三字节编码(3个码元)
- 依次类推
还需要注意的是如果某个字符是由多个字节编码的,那除了首字节外,其余字节都需要用 10 开头
- UTF-16编码:使用 unicode字符集,规定码元为 2个字节,由于2个字节最多表示 65536 个字符,因此除了基本平面,其余平面的字符都需要用 两个码元 来表示,我们熟悉的 javascript 就是采用的这种编码方式
- UTF-32编码:使用 unicode字符集,规定码元为 4个字节,由于4个字节最多表示 4294967295 个字符,而unicode字符集总共 65536 x 17 = 1114112,因此一个码元就足以表示所有字符,也就是说unicode里的所有字符一视同仁,都是用 4个字节 来表示,可想而知这种方式异常浪费空间
结语
之前一直对字符集和编码方式搞混淆,还以为他俩是一个东西,但是经过最近的研究后才发现之前自己是多么“天真”,我相信在以后的开发中对于字符编码方面的问题的处理能更加得心应手,我想这就是我的收获吧~