找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 11|回复: 0

第18集的文字稿

[复制链接]

406

主题

308

回帖

3188

积分

管理员

积分
3188
发表于 3 天前 | 显示全部楼层 |阅读模式
001.
统一字符集UCS使用三种编码形式(encoding forms),分别是UTF-8、UTF-16和UTF-32,下面我们分别予以介绍。


UTF-8这个名字意味着它是基于8比特的编码形式。UTF-8编码是变长的,由至少一个,最多4个8比特组成。

首先,平面0,也就是基本多语种平面内,最前面的128个字符就是原ASCII字符集的字符。对于平面0中的128个原ASCII字符,使用一个8比特进行编码,其辨别特征是8位元的最高位是0。这种只有1个8比特的编码可以兼容ASCII 字符集的编码。


接下来,对于基本多语种平面内,位于原ASCII字符之后的1920个字符,主要内容为拉丁字母、希腊文、西里尔文、科普特语、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文,等等,使用两个8比特进行编码,其辨别特征是第一个8比特以110引导,第二个8比特以10引导。


三个8比特的形式用于编码平面0的剩余字符,主要内容为常用的中文、日文和朝鲜文字(合称CJK字符),其辨别特征是第一个8比特以1110引导,其余两个8比特都以10引导。


四个8比特的形式用于编码其它平面的字符,比如更多(但不常用)的汉字,以及表情符号等等,,其辨别特征是第一个8比特以11110引导,其余三个8比特都以10引导。在这里,统共有21个比特用于映射代码点,可以表示两百多万个字符。


再来看UTF-16,这个名字意味着它是基于16比特的编码形式,以16比特为单位来编码字符。和UTF-8编码方案一样,UTF-16编码也是变长的,由一个或者两个16比特组成。

因为单个16比特可以编码的字符数量有限,只能编码65536个字符,所以单个16比特的编码形式只用于编码基本多语种平面内的字符,也就是代码点为U+0000到U+FFFF的字符。在单个16比特的编码形式中,字符的编码就是它的代码点。


相反地,两个16比特的编码形式可以容纳更多的字符,所以被用来编码其它平面内的字符,也就是代码点为U+10000到U+10FFFF的字符。在统一字符集UCS中,除基本多语种平面外的其它平面叫做辅助平面。


如果采用两个16比特的编码形式,则每一个16比特都添加固定的比特前缀,分别是110110和110111。理论上,这两个16比特的剩余部分用于填充代码点,但实际上,是先将代码点减去0x10000之后再进行填充。填充之后,这两个16比特共同用于表示一个32位的字符编码,称为代理对。至于为什么叫代理对,我们稍后再解释。


显然,第一个16比特,也就是代理对的第一部分,它的取值范围是二进制的
1101100000000000~1101101111111111
也就是十六进制的D800~DBFF;


同样的道理,第二个16比特,也就是代理对的第二部分,它的取值范围是二进制的
1101110000000000~1101111111111111
也就是十六进制的DC00~DFFF。


UTF-16是变长的编码形式,由一个或者两个16比特组成。问题是,在单个16比特的UTF-16编码中,也可能出现110110xxxxxxxxxx或者110111xxxxxxxxxx这样的编码。这样就难以区分它是单个16比特的UTF-16编码还是两个16比特的UTF-16编码。而且,在单个16比特的UTF-16编码中,字符的编码就是字符的代码点;而在两个16比特的UTF-16编码中,字符的编码并不是代码点,而是经计算得到的代理对。


举个例子来说,代码点为U+10302的字符,不在基本多语种平面内,要采用两个16比特的UTF-16编码形式,编码为D800 DF02。但是,在单个16比特的UTF-16编码形式中也会出现这两个编码,但对应着两个字符,其代码点分别为U+D800和U+DF02。


既然如此,那就牺牲一下单个16比特的UTF-16编码形式,禁止它用于编码那些代码点介于U+D800~U+DFFF之间的字符。既然如此,在统一字符集UCS里,这个区间内的代码点也就不能够对应于任何字符。也就是说,在基本多语种平面内的这个位置留下了没有任何字符的空洞。这样做是有道理的,因为我们经常需要在各种不同的编码方式之间转换,例如从UTF-8转换为UTF-16。如果UTF-8所编码的字符恰好位于这个区间,则它转换为UTF-16后依然会造成尴尬的局面。


如图中所示,因为上述原因,单个16比特的UTF-16编码形式,其允许的代码点范围就是两个区间:U+0000~U+D7FF和U+E000~U+FFFF。


最后来看UTF-32,这个名字意味着它是基于32比特的编码形式,以32比特为单位来编码字符。UTF-32又叫UCS-4。


相比于UTF-8和UTF-16,UTF-32编码方式非常简单,它对每个字符使用固定的32比特编码,直接将代码点扩充为32位后,就是字符编码。因为UTF-16代理对的原因,代码点区间U+D800~U+DFFF不对应任何字符,所以UTF-32(包括前面的UTF-8)不应用于编码这些字符。


这个表很好地展示了UTF-8、UTF-16和UTF-32这三种编码形式的特点及它们的不同之处。<...>

非常清楚的是,除了UTF-8,UTF-16和UTF-32都无法兼容ASCII字符编码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2024-11-23 20:32 , Processed in 0.239665 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表