编码
首先,我们来了解编码是什么?
由于计算机只认识0和1,为了标识字符,需要一套统一的规则来实现诸如 0100 0001-> A 的映射,这就是编码
同时,随着计算机的发展,需要标识的字符不断在增加,导致编码种类也在不断的增加
ASCLL
最基础的编码,是由美国人定义的,他们用1字节(8位)来定义他们使用的所有字符
由于英文就26个字母,256(2^8)个映射位足矣标识所有字符
实际上,ascll只用了后面的7位(首位为0,形如 0xxx xxxx),定义了128个字符,以A为例:
A -> 65 -> 0100 0001
Unicode
随着各个国家都开始用编码来标识自己本国用的字符,大家逐渐发现1字节的编码方式根本不够用:
- 本国语言可能需要超过256个字符
- 多国语言对于同一个映射位,有不同的解释,比如上面的65在美国是A,但是在其他国家就可能是别的含义了,大家交流很费事,需要频繁的转换
这时候unicode应运而生,unicode相当于一个超级大(解决1)的字典,每个字符在唯一的值(解决2)
但是unicode只是一个字典,具体编码方式其实没有固定,如下所示:
A->65 -> ?
只规定了一个字符到一个数字的映射
UTF-8
- utf-8是unicode的一种实现
- 兼容了已有的ascll
- 长度可变,1~4字节
编码规则:
-
字节长度=1时:第一位填0,剩余7位是该字符的unicode的编码值,这个方式与ascll码的编码方式一致,所以可以完全兼容ascll码
-
字节长度>1时:假设需要N个字节,第一个字节的前N位都是1,第N+1位设为0,剩余N-1个字节的前两位都是10,剩下来的所有位置用来作为该字符unicode的编码值
规则2说起来较为复杂,我们看下表格就比较容易理解了:
unicode 编码值范围 | utf-8 二进制 |
---|---|
0000 0000 ~ 0000 007F | 0xxxxxxx |
0000 0080 ~ 0000 07FF | 110xxxxx 10xxxxxx |
0000 0800 ~ 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000 ~ 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
总结
- ascll :最基础的编码,1字节,实际定义了128个字符
- unicode:一种映射规则,为所有字符编上码,但没有具体实现
- utf-8:是unicode的一种具体实现,1~4字节,兼容ascll