首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文搞清楚unicode字符集的三种实现方式

这篇文章其实早就想写了,准确的说应该是总结一下!之前看过很多篇关于编码的文章,也遇到过一些编码的问题,这篇文章就聊一聊!

ASCII

这种编码应该是我们最早接触的,也是最简单的!这种编码方式主要是为英文世界服务的,毕竟计算机是美国人发明的,他们肯定首先服务于自己的文字!

ascii一共囊括128个字符的表示,包括26个大小写英文字母,这对于英文世界基本足够了,

demo1

一个字节(8位二进制)就可以搞定,而且只用了7位,还有富余!但是这个世界不只有老美,还有很多其他国家需要使用计算机,所以就算把一个字节的8位都用上,也不够表示世界上那么多的字符!

Unicode

如果每个国家都搞一套自己的字符集,那对于计算机来说简直就是灾难!计算机就好比一个人,让其掌握这世界上的所有语言那是非常痛苦的,但是如果世人都说汉语,那就很happy了,只需要说一种语言就可以了!

基于这种情况,美国人就搞出了一套标准的字符集,就是unicode,记录了世界上大部分字符与数字之间的映射,有点类似于新华字典!

unicode是字符集,解决了每个字符对应的数字,数字一般都是二进制表示,当把一段文章翻译成数字,可能是这样的:1101010100101010101110011110011000.......

如果没有规则,这一段数字就是天书,完全不知道如何分割这些二进制数字去对应字符,所以还需要指定编码规则,在编码后还能容易解码!

码点codePoint:字符在unicode中对应的数字

utf-8

utf-8就是Unicode字符集编码的一种实现方式,规则如下:

demo2

demo2中左侧对应码点的区间,右侧对应编码规则,也可以看出来utf8编码方式是变长的,由一个字节到四个字节不等!

编码规则:

通过码点在demo2左侧找到自己的区间,了解到需要n个字节

第一个字节高位由n个1加一个0组成,剩下的字节高位都是10

把码点转化成二进制由低位到高位填充进xxxxxx中,填不满的用0补充

知道了规则,其实就会觉得utf8编码非常的简单!

utf-16

utf-16是Unicode编码的另外一种实现方式,在说utf-16编码规则之前,先了解几个概念!

平面:unicode这本字典在定义字符到数字映射的时候,是分区定义的,类似于居民区的小区,将不同的字符划分到不同的区域,每个区域有65536个字符(2^16),这样一个区域称为平面,这样的平面有17个(2^5)

基本平面:最早发布的就是最开始的这个平面,简称BMP,范围U+0000-U+FFFF,两个字节表示

辅助平面:剩下的16个平面,简称SMP,范围U+010000-U+10FFFF,四个字节表示

如果码点落在基本平面,码点直接转化成16位二进制(两个字节),不足时高位补零!

如果码点落在辅助平面,稍微麻烦些!

在基本平面的区间,从 U+D800 到 U+DFFF 是一个空段,即这些码点不对应任何字符!

辅助平面一共2^20字符,需要20位二进制表示,此时将此20位分成两段,前10位映射在 U+D800 ~ U+DBFF,称为高位(H),后10位映射在 U+DC00 ~ U+DFFF,称为低位(L),总共四个字节。

unicode给出了具体的映射规则:

H = Math.floor((c-0x10000) / 0x400)+0xD800

L = (c - 0x10000) % 0x400 + 0xDC00

c代表码点

demo3

demo3中对应的utf-16编码结果是0xd842 0xdfb7

稍微算了一下:高位有2^10种可能,低位也是2^10种可能,两者一起正好能表示2^20种可能,这是巧合吗,还是有意而为之?

utf-32

utf-8编码由1个到四个字节表示,utf-16编码由2个或者4个字节表示!

utf-32编码方式比较干脆,统一由四个字节表示,这种方式很浪费空间,不推荐使用!

总结

这篇文章总结了一下unicode字符集三种实现方式utf8、utf16和utf32,因为平时经常遇到编码的问题,所以还是总结一下!

喜欢我的文章就关注我吧,有问题可以发表评论,我们一起学习,共同成长!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191119A0NRDG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券