名奢网 名表 名表日报 查看内容

一遍弄清楚Unicode和UTF-8

2023-4-4 10:38| 发布者: wanhu| 查看: 140| 评论: 0

放大 缩小
简介:什么是Unicode?Unicode,中文又称万国码、国际码,是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。 简单来说,就是一套囊括的世 ...

什么是Unicode?

Unicode,中文又称万国码国际码,是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。

简单来说,就是一套囊括的世界上大部分国家的文字编码方式,使得全球的计算机在文字编码上能够拥有统一的标准。

为什么会有Unicode?

计算机是在美国发明的,理所当然的使用的是英文字母,构成英语的不过就是26个拉丁字母加一些符号和数字,所以最初的电脑编码系统比较简单,也就是大家最熟悉的ASCII ((American Standard Code for Information Interchange)美国信息交换标准代码)。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符 。


一遍弄清楚Unicode和UTF-8

128个字符,只需要1个字节就可以表示。存储很简单,效率也很高。但是随着世界发展,世界上使用计算机的人越来越多,就带来了一个问题,不是全世界人民都使用的拉丁字母,有些国家使用的字母里有许多是ASCII里没有的。

人总是会想办法的,为了可以在计算机保存他们的文字,他们决定采用127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128到255这一页的字符集被称扩展字符集

但是在中国,这一套行不通,我们使用的文字系统汉字的数量又有上万个,我们需要建立自己的编码方式。中国人的解决方案是:小于127号的还是继续使用,并且用2个大于127的字节表示一个中文字符,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的 全角 字符,而原来在127号以下的那些就叫 半角 字符了。 这个汉案叫做 “GB2312“。

但是中文汉字的数量太多了,不够用,大家发现冷门生僻字和繁体字等等还是无法识别。于是就只是要求高字节大于127就认为是2字节的中文字符,这样结果扩展之后的编码方案被称为 GBK 标准,GBK包括了GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。但是还有少数民族同胞也需要使用电脑,于是有扩展少数民族字符,这样GBK扩成了 GB18030,这样,一套能适配中国的字符编码就完善了。

中国不是个例,当时几乎每个不兼容ASCII的国家都搞了一套自己的字符编码,且只适用于自己国家,可以想象各国之间沟通时的混乱,不知道编码方式,你看到的就是一团乱码。所以,创立一套统一世界字符的编码是势在必行的。

ISO(国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:弃用所有的地区性编码方案,重新搞一个包括了地球上所有文化的字母和符号的编码!叫做”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 Unicode

Unicode开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是 ISO 就直接规定必须用 两个字节 ,也就是16位来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,所以这个方案对使用低8位就足够的编码系统的那些人来说,储存空间着实有点浪费,因为互联网大部分的内容都还是英文的。这里就要讲到UTF-8了。


UTF

什么是UTF?

首先,我想大家都明白,字符编码其实就是把每一个字符与一个二进制串对应起来,形成一个对应关系,一张对应表。你可以直接按照这张对应表把字符转成二进制存储起来,再在别的地方读取出来按照这张表翻译出内容。就比如ASCII码,你只需要读出一个字节,然后查表就知道这是什么字符了。Unicode同样可以如此,你只需要每次读两个字节,然后查表就可以了。这样的方式就有一个痛点,原本ASCII码中单子节就能表示的字符,比如0000 0001,你必须存0000 0000 0000 0001(有人问为啥不能只存0000 0001啊?答:那碰到一个字符对应的二进制前8位也是0000 0001,那计算机怎么决定?所以必须两个字节对于一个字符)而最常用的字符都是单子节的,浪费的存储空间是很大的。

其实我们可以发现,问题并不出在Unicode的编码上,因为它定义的只是字符对应的一个编号而已,6万个符号无论你怎么编,都一定要6万个数来对应不是吗?这时大家可以看看上面的ASCII表图片,可以看到每个字符前面都有个10进制的数字,这其实就是排个序挨个给每个字符编个号而已,具体你怎么存,那是你存储方式的问题,人家只规定来这个编号对应哪个字符。只不过直接按照编号对应二进制来存刚好最合适而已。

但是在Unicode这里,直接用编号对应的二进制来存就不太合适,浪费太多,所以问题其实出现在存取的方式上面。这里就可以引出UTF了。Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对 Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicod转换格式(Unicode Transformation Format,简称为UTF)。

UTF-8也就是UTF中的一种而已,你肯定也听过还有UTF-16,UTF-32什么的。到这里其实我已经讲清楚Unicode和UTF-8的区别了,但是具体搞清楚UTF-8是采用了什么样的存取方式,哦不,我们现在要改口叫实现方式,从而实现了存储空间的节省,就需要到另一篇详解UTF-8是如何设计的了。


路过

雷人

握手

鲜花

鸡蛋
已有 0 人参与

会员评论

文章排行

  • 阅读
  • 评论

最新文章

文章列表

 名表回收网手机版

官网微博:名表回收网服务平台

今日头条二维码 1 微信公众号二维码 1 抖音小程序二维码 1
浙江速典奢贸易有限公司 网站经营许可证 备案号:浙ICP备19051835号2012-2022
名表回收网主要专注于手表回收,二手名表回收/销售业务,可免费鉴定(手表真假),评估手表回收价格,正规手表回收公司,浙江实体店,支持全国范围上门回收手表
返回顶部