一文搞懂 unicode 与 utf-8

编码

首先,我们来了解编码是什么?

由于计算机只认识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字节的编码方式根本不够用:

  1. 本国语言可能需要超过256个字符
  2. 多国语言对于同一个映射位,有不同的解释,比如上面的65在美国是A,但是在其他国家就可能是别的含义了,大家交流很费事,需要频繁的转换

这时候unicode应运而生,unicode相当于一个超级大(解决1)的字典,每个字符在唯一的值(解决2)

但是unicode只是一个字典,具体编码方式其实没有固定,如下所示:

A->65 -> ?

只规定了一个字符到一个数字的映射

UTF-8

  • utf-8是unicode的一种实现
  • 兼容了已有的ascll
  • 长度可变,1~4字节

编码规则:

  1. 字节长度=1时:第一位填0,剩余7位是该字符的unicode的编码值,这个方式与ascll码的编码方式一致,所以可以完全兼容ascll码

  2. 字节长度>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

参考

彻底弄懂 Unicode 编码

猜你喜欢

转载自juejin.im/post/7030803429433802783