Unicode 与 UTF8,16,32什么意思以及之间的联系

什么是Unicode,UTF-8,UTF-16,UTF-32?要知道他们是什么或者厘清他们之间的联系,需要从我们知道的Ascll码说起。

ASCII

在计算机中,每八个二进制组成了一个字节(Byte),所以以前人们用8为二进制码来编码英文字母(第一位是0),比如“01000001”代表大写字母A。但是这样不同的组成只有128个,在美国128个字母够了,但是在世界各地,各种语言就不够用了,于是,许多国家将第一位变为1,又生出了许多不同的字符。与此同时,新的问题便产生了,不同国家对新增的128个数字赋予了不同的含义。所以不同的国家有不同的编码方式,所以不知道对方的编码方式,就会导致乱码。

Unicode

针对此现象,Unicode出现了。Unicode为世界上所有字符都分配了一个唯一的数字编号,这个编号的范围从0x000000到0x10FFFF,有110多万,这个编号一般写成16进制,在前面加上U+,例如“马”的Unicode是U+9A6C。Unicode本身只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。对于存储,便产生了多种方案:主要有UTF-8,UTF-16,UTF-32。

UTF-8

UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。
其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8 是 Unicode 的实现方式之一。

UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8 的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

下表总结了编码规则,字母x表示可用编码的位。

|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| |

跟据上表,解读 UTF-8 编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

下面,还是以汉字严为例,演示如何实现 UTF-8 编码。

严的 Unicode4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800 - 0000 FFFF),因此严的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx。然后,从严的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,严的 UTF-8 编码是11100100 10111000 10100101,转换成十六进制就是E4B8A5

UTF-16

UTF-16也是一种变长编码,对于一个Unicode字符被编码成1至2个码元,每个码元为16位。
在基本多语言平面内的码位UTF-16编码使用1个码元且其值与Unicode是相等的(不需要转换)。
在这里插入图片描述
具体的转换过程为

1 首先将unicode码表 - 0x10000 , 这样得到的辅助平面的码表范围为(U+0000 - U+FFFFF) ,总共最多20bit
2 将20bit ,分为high 10bit 与 low 10bit。 high 1bit | 0xD800 得到前导代理, low 10bit | 0xDC00 得到后尾代理
从这里也可以理解为什么 在基本多语言平面中, (U+D800 ~ U+DFFF ) 要作为保留字符了

UTF-32

这个就是字符所对应编号的整数二进制形式,四个字节。这种存储方式即最简单直接的直接转换,如将“马”的U+9A6C直接转化为二进制1001101001101100。

注:计算机在存储器中排列字节有两种方式:大端法和小端法,大端法就是将高位字节放到低地址处,比如0x1234,计算机用两个字节存储,一个是高位字节0x12,一个是低位字节0x34,如果不分大小端的话,那么就会出现解读错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值