Unicode和UTF的联系与区别

什么是Unicode?

Unicode中文直译为“统一码”,也可意译为“万国码”,但是翻译成万国码并不算确切,因为在还有一种编码方式为UCS(Universal Character Set),这个编码也是涵盖了全世界的主要字符,当然包括中文,说白了,和Unicode一样,都是所谓的“万国码”。
在说明Unicode之前,先扯一下Unicode和UCS的这两种编码格式的区别。
这两种编码格式都是“现役”编码格式,都是正在被广泛使用的编码格式。
那为什么要有两种“万国码”编码方式呢?
这得从历史说起。在计算机发展的过程中,其他各国语言都要应用在计算机之上,而计算机的本地语言拉丁语系列显然不能满足发展的需求,于是有了各种用于计算机语言本地化的编码方式,例如用于简体中文的GBK,GB2123,用于繁体中文的BIG5等,但是,随着计算机的发展,除了本地化,还要国际化,即要在同一系统或者同一页面上使用多国语言。这就需要一种编码方式能够囊括当下世界各地能够应用计算机的各种语言,最好是全部语言,当然,如果一种语言对应的实体并不能带来经济效益,可能也不会被囊括进来,总之,需要一个“万国码”这样的东西。
当时世界上有两个组织在做“万国码”,一个是ISO(International Organization for Standardization:国际标准化组织),一个是The Unicode Consortium(统一码联盟)。这两个都是国际化组织,ISO是来制作各种世界通用标准包括各行各业(涵盖垄断行业技术标准),统一码联盟是美国的一个收费会员组织,成员公司有苹果、微软、IBM、惠普等软硬件公司等,这两个组织制作“万国码”都在情理之中,但是,我们并不需要两个不同的组织制定的两个不同的“万国码”,有一个就好,于是,后来,这两个组织就商量着没必要各搞一套,然后就统一了,没错,就是这么和谐。虽然统一了,但是各自还是有各自的标准,表面上看起来不一样,内部使用的码表是一样的。Unicode码是统一码联盟的产物,UCS是ISO的产物,两个的历史渊源,以上。

Unicode与UCS的联系与区别?

不细分,没区别。因为两个使用了相同的字库和字码。Unicode(和UCS)使用4字节编码字符,但是高字节的最高一位不参与编码,也就是31位。UCS有两种,一种是使用两个字节编码的叫UCS-2(其实是前两个字节全为0的UCS-4),一种是使用4字节编码的叫UCS-4。

什么是UTF?

UTF的英文全称叫做Unicode Transformation Format,中文直译为Unicode转换格式。
对于Unicode码表,在计算机中存储和传输中直接使用四个字节表示最为直接,字节内容一一对应码点,这种编码方式有明显的缺点,对于拉丁系语言及一些东南亚语言的常见语言使用的仅仅使用低位两个字节,特别的,英文字符使用一个字节表示绰绰有余,如果在使用中直接使用四个字节编码,会浪费大量的空间,于是有了对Unicode码表不同的编码方式,上面使用四个字节直接表示的方式叫UTF-32,现实中大行其道的编码格式是UTF-8.

什么是UTF-8?

UTF-32使用四字节定长表示,浪费空间。好的方式是使用变长的方式来表示。诺,UTF-8使用1-4个字节变长表示。在Unicode码表中,使用了UCS的第0组前17个面,而主要字符又集中在第0组的第0面(基本平面),也就是说最常用的字符1-3个字节就能够表示,对于一些特定语言的字符则使用的更少,如英语使用1个字节表示,中文大部分位于第二平面,转换成UTF-8之后为3个字节(转换方式见下文)。UTF-8的编号范围与其对应字节数的对应关系如下表。

Unicode的UTF-8编码方式?

对于单字节字符,也就是ASCII码的部分,UTF-8使用一个字节的低7位表示,和ASCII码表一样。
对于多字节(n位字节)字符,其编码方式为第一个字节的前n位为1,第一个字节的第n+1位为0,后面字节的前两位都为10,Unicode码从低位填充,高位空位用0补足。经过此编码过后,原本两字节的码点现在可能需要3字节,也就是说用4个字节并不能表示Unicode的全部码点,然而标准就是这么定的。如果想要表示全部的Unicode码点,需要6个字节,然而,5-6个字节表示并不在UTF-8的编码范围中,因为UTF-8在规范之后只能使用4个字节表示。总结来说,UTF-8空间利用率高,但是并不能表示全部的Unicode码点。
如下图所示:

其他UTF转换格式?

除了UTF-8,UTF-32,还有UTF-7,UTF-7.5,UTF-16等,JAVA内置使用UTF-16。

什么是UTF-16?

UTF-16编码规则为:基本平面(第0平面)使用2个字节,辅助平面(第1-17平面)的字符使用4个字节。那UTF-16也能表示全部的Unicode码点。中文主要位于第二平面,所以中文在JAVA中使用的4字节表示。使用UTF-16还有一个问题,当我们遇到两个字节的时候,我怎么知道这是单独的一个字符还是四字节字符的一部分呢?如下图所示:

Unicode(UCS)31位bit如何划分?

unicode(UCS)根据字节的先后顺序将四个字节分为四个部分。如下图所示:

第一个字节用来分组,共128组,第二个字节用来分平面,共256平面,每个平面有256行,每行有256码位,也就是每个平面有65536(2的16次方)个码位,码位中字符的编码并不是顺序编码,中间有空码位。这种分组分面的做法原本是UCS的做法,但后来统一后,Unicode也采用了这种方式。Unicode只使用第0组(group)的第0-16平面(第0组的第0平面叫做基本平面,其他平面叫做辅助平面),其他平面不使用,那UCS也保证不给其他平面中的码位赋值,中文常见字符主要位于第二平面而且第二平面上也只有中文,不常见字符在后面其他平面也有分布,所以,使用UTF-8编码的话,中文可能使用3-4个字节编码,使用UTF-16编码,中文使用4个字节编码,使用UTF-32编码,中文使用4字节编码。
以上。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值