Unicode、UTF-8、UTF-16、UTF-32各是什么?
Unicode是什么?
Unicode(统一码),它将世界各种语言里的每一个字符都定义了一个唯一的编码。这意味着世界上所有的语言都可以使用它,而不会出现冲突。
虽然Unicode编码了所有字符,但是在很多情况却不能直接使用它,为什么?
因为在Unicode中有些字符占一个字节,如:英文字符,有些字符则占两个字节,如:常用汉字。但是当我解码一串中英字符混合的Unicode编码时,我是一次解码一个字节呢还是两个字节呢?UTF-8
,UTF-16
,UTF-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的过程:
- 将Unicode编码减去
0x10000
,即把编码减少或向前平移一位, - 将得到的编码分为两部分,每一部分为10位二进制数(10bit)。
- 在高位的10bit前补上6位的标识
110110
,这样就刚好16位,两个字节。 - 在低位的10bit前补上6位的标识
110111
,补完后刚好16位,两个字节。
为什么要执行步骤1?
因为Unicode一共有17个平面,每个平面都可以表示65536个字符,总共可以表示1114112个字符,这就意味着要二进制编码要21位才能包含所有字符,这里减去0x10000
是因为减去后就多只要20位就可以表示所有字符,这样更好被分为2个部分。
UTF-32是什么?
4个字节足以表示任何Unicode,因此UTF-32就采用每个字符4个字节的储存形式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步