Unicode、UTF-8、UTF-16、UTF-32各是什么?

Unicode是什么?

Unicode(统一码),它将世界各种语言里的每一个字符都定义了一个唯一的编码。这意味着世界上所有的语言都可以使用它,而不会出现冲突。

虽然Unicode编码了所有字符,但是在很多情况却不能直接使用它,为什么?
因为在Unicode中有些字符占一个字节,如:英文字符,有些字符则占两个字节,如:常用汉字。但是当我解码一串中英字符混合的Unicode编码时,我是一次解码一个字节呢还是两个字节呢?UTF-8UTF-16UTF-32解决了这个问题。

UTF-8是什么?

UTF-8(Unicode Transformation Format,Unicode转换格式),它是一种Unicode编码的实现。

UTF-8解决之前提到的问题,解决方法如下:

  • 0xxxxxxx:如果是这样的格式,表示在UTF-8中这个字符用这一个字节即可表示,读取这一个字节即可解码成一个字符。因为第一位已经规定为0,所以只有7位能用来放置Unicode编码。
  • 110xxxxx, 10xxxxxx:如果是这样的格式,则表示在UTF-8种这个字符用两个字节可以表示,读取两个字节可以解码成一个字符。110表示此字节为开头字节,10表示此字节不是开头字节。因为第有5位已经固定,所以仅有11位可以用于存放Unicode编码。
  • 1110xxxx, 10xxxxxx, 10xxxxxx:如果是这样的格式,则表示在UTF-8种这个字符用三个字节可以表示,读取三个字节可以解码成一个字符。1110表示此字节为开头字节,10表示此字节不是开头字节。因为第有8位已经固定,所以仅有16位可以用于存放Unicode编码。所以虽然汉字在Unicode中占两个字节,但是汉字在UTF-8中是占三个字节的。

UTF-16是什么?

UTF-16使用2或者4个字节来表示字符。
U+0000 ~ U+FFFF:使用两个字节表示。
U+10000 -~U+10FFFF:使用四个字节表示。

怎样判断其是四个字节的字符?
110110xx, xxxxxxxx, 110111xx, xxxxxxxx:这种形式的即为四个字节的字符,前两个字节,后两个字节。但注意xx不是用来补充Unicode字符的,而是用来补充平移后Unicode字符的。

使用四字节表示Unicode的过程:

  1. 将Unicode编码减去0x10000,即把编码减少或向前平移一位,
  2. 将得到的编码分为两部分,每一部分为10位二进制数(10bit)。
  3. 在高位的10bit前补上6位的标识110110,这样就刚好16位,两个字节。
  4. 在低位的10bit前补上6位的标识110111,补完后刚好16位,两个字节。

为什么要执行步骤1?
因为Unicode一共有17个平面,每个平面都可以表示65536个字符,总共可以表示1114112个字符,这就意味着要二进制编码要21位才能包含所有字符,这里减去0x10000是因为减去后就多只要20位就可以表示所有字符,这样更好被分为2个部分。

UTF-32是什么?

4个字节足以表示任何Unicode,因此UTF-32就采用每个字符4个字节的储存形式。

参考文章:https://www.jianshu.com/p/2ba2d99df0bf

posted @   来个煎饼  阅读(382)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示