不同字符编码:ASCII ,ISO8859-1,GB2312,GBK,UTF-8
字符编码:
- 规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系
- 编码与解码的转换关系。
为什么有这么多的字符编码
由于计算机的发展,刚开始计算机由美国人发明,他们只使用ASCII码即可表示所有的字符,但是之后越来越多的国家开始使用计算机,为了满足他们的需求于是有了其他的标准,新的标准表示的范围大了,必然所占用的空间增大,引起原本只需要使用ASCII国家的不满,于是为了减少占用的空间和硬盘空间,所以有了UTF-8等不定长的字符编码。
总结一下:1. 满足不同国家的需求 2. 减少占用的空间和硬盘空间
各个字符编码的实现
字符编码 | 是否定长 | 占用空间 | 实现原理 | 备注 |
ASCII码 | 是 | 单字节 | 使用单字节8位,前127个存储英文字母即标点符号 | 老美发明 |
ISO8859-1 | 是 | 单字节 | 扩展ASCII码,在128-255位置编入了新字符。 | 西欧国家使用 |
GB2312 | 否 | 1-2字节,不定长编码 | 高低位都存放大于127的数字,兼容ASCII码(英文1个字节,中文2个字节) | GBK2312只囊括简体中文 |
GBK | 否 | 1-2字节,不定长编码 | 扩展GB2312,高位存放大于127的数字,低位将127之前的数字也囊括了 | GBK囊括繁体中文 |
UTF-8 | 否 | 1-4字节,不定长编码 | 是一种Unicode的一种编码实现 | 老美不满意Unicode的ASCII的双字节编码 |
GB2312:
兼容ASCII码,当是英文字符时,使用一个字节进行存储和读取,当是中文字符时使用两个字节进行存储和读取。存储中文时,高位和低位的最高位皆为1,存放大于127的数字,即取高位字节时,若大于127则表示是中文字符,将读取双字节进行识别,若小于127,则认为是英文字符,单字节识别。
GBK:
对GB2312的扩展,低位不再存储大于127的数字,将低于127的数字也包括进来,囊括了繁体字符。
UTF-8的编码规则:
UTF-8最大的特点,变长的编码方式,使用1-4个字节表示一个符号
- 对于单字节的符号,字节的最高位设为0,后面7位为这个符号的Unicode码
- 对于n字节的符号,第一个字节的前n位皆为1,n+1位为0,后面字节的前两位开头一律为10,剩下的为该字符的Unicode码。
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Unicode与UTF-8有什么关系
- Unicode是字符集,是用双字节编码表示,囊括了全球所有的字符,为每一个字符分配一个唯一的ID,不管ID如何存储。(对于ASCII码,高位补0)
- UTF-8是字符编码规则,UTF-8是Unicode的实现方式之一,定义如何存储编码ID的一种方法,将码位转换为字节序列的规则。这样让计算机看到某个标记就知道要读取几个字节的代码,避免问题的发生。(容错性)
不考虑历史因素,从技术角度解释为什么在unicode和UTF-8大行其道的同时,GB2312和GBK仍在广泛使用。
三者皆使用了变长编码。GB2312和GBK表示中文字符占用2个字节,兼容ASCII码;UTF-8也兼容ASCII码,但UTF-8中的中文字符需要使用3-4个字节表示,大部分为3个字节。因此对于中英文混合编写的使用GB2312和GBK更省空间、效率更高。
参考:
- http://www.manongjc.com/article/128628.html
- https://baijiahao.baidu.com/s?id=1658673546069690193&wfr=spider&for=pc
- 不同字符编码区别:ASCII ,ISO8859-1,GB2312,GBK,Unicode,UTF-8:https://blog.csdn.net/Fly_1213/article/details/85249201
- Unicode 和 UTF-8 有何区别?:https://www.zhihu.com/question/23374078/answer/65352538
- UTF-8编码原理:https://blog.csdn.net/airjordon/article/details/82699223
- 字符集与编码(三)——定长与变长:https://my.oschina.net/goldenshaw/blog/307708