Unicode编码详解(⼀):Unicode简介及其分类
Unicode编码详解(⼀):Unicode简介及其分类
本⽂为原创⽂章,转载请注明出处,或注明转载⾃“黄邦勇帅(原名:黄勇)
本⽂是对《C++语法详解》⼀书相关章节的增补,以增强读者对字符的理解,因为《C++语法详解》引⽤的标准过于⽼旧。
有兴趣的读者可参阅本⼈所著《C++语法详解》⼀书,电⼦⼯业出版社出版,该书语法⽰例短⼩精悍,对查阅C++知识点相当⽅便,并对语法原理进⾏了透彻、深⼊详细的讲解,可确保读者彻底弄懂C++的原理,彻底解惑C++,使其知其然更知其所以然。此书是⼀本全⾯了解C++不可多得的案头必备图书。
由于本⼈能⼒有限,⽂中难免有错漏之处,望⼴⼤读者指出更正,不胜感激
⼀、基本知识
1、Unicode
Unicode⼜称为统⼀码、万国码、单⼀码,是国际组织制定的旨在容纳全球所有字符的编码⽅案,包括
字符集、编码⽅案等,它为每种语⾔中的每个字符设定了统⼀且唯⼀的⼆进制编码,以满⾜跨语⾔、跨平台的要求。Unicode制定的内容⾮常多,为便于讲解,本⽂仅对Unicode字符集和Unicode编码⽅案重点讲解
2、ISO 10646与通⽤字符集(Universal Character Set,UCS)
历史上,除了Unicode在试图制定全球统⼀的通⽤字符集外,国际标准化组织 ( ISO )也在制定相应的标准,其中通⽤多⼋位编码字符集(Universal Multiple-Octet Coded Character Set ),简称通⽤字符集(Universal Character Set,UCS)就是由ISO制定的ISO 10646标准所定义的字符集,是与Unicode并⾏的标准。最初,ISO与Unicode各⾃开发各⾃的项⽬,后来,双⽅意识到世界不需要两个不兼容的字符集,于是,双⽅进⾏了整合,并使彼此制定的标准相互兼容,以使两者保持⼀致,直到现在,两个组织都存在,并且各⾃独⽴公布各⾃的标准,但⼆者基本是⼀致的,不过Unicode的知名度⽐UCS更⼤,应⽤也更⼴泛。直⾄2020年3⽉,Unicode的版本为Unicode 13.0.0
⼆、基本术语及专业基础知识
1、字符
本⽂所指的字符是⽂字和符号的总称,包括⽂字、数字、字母、标点符号、图形符号等。
2、表意⽂字和象形⽂字
表意⽂字是指将意思置换成形状来表⽰的⽂字的统称,所以,表意⽂字只要看到⼀个⽂字的形状就能理解想要表达的意思。表意⽂字有很多,如汉字、彝⽂、东巴⽂等。注意:象形⽂字属于表意⽂字中的⼀种
3、CJK统⼀表意⽂字(CJK Unified Ideographs)简介
CJK是中国(Chinese)、⽇本(Japanese)和韩国(Korean)的缩写,其⽬的是要把分别来⾃中⽂、⽇⽂、韩⽂、越⽂等,本质和意义相同、形状⼀样或稍异的表意⽂字于ISO 10646及Unicode标准内赋予相同编码。顾名思义,CJK能够⽀持中、⽇、韩三种⽂字。
三、计算机怎样处理字符
计算机只能处理⼆进制数字,那么怎样处理字符呢?可以想到的最简单的办法就是在字符和数字之间进⾏映射(编码),即,只需把字符想办法转换为⼆进制数字就⾏了,⽐如将字符“A”映射为10进制整数65,然后再将65直接映射为⼆进制数0100 0001,同理,可
将“B”映射为66等,这样计算机就能处理字符A了,这⾥的“映射”在计算机中被称为“编码”,现在的计算机就是使⽤这种简单的思想处理字符的,只是其具体过程更复杂,⾄此,可能⼤家会产⽣出以下问题:
为什么要进⾏两次编码,直接编码为⼆进制不是更省事吗?其实这很简单,第⼀次编码准确的说其实就是为每个字符编了⼀个号,这个编号可⽅便⼈们使⽤,编号通常是10进制或16进制数,这样在以后指定某个字符时,可以直接使⽤数字来指定这个字符,很明显,直接使⽤⼆进制更不⽅便,⽐如,对于ASCII字符集,可以⽅便的使⽤65表⽰字符“A”,显然,使⽤⼆进制数0100 0001更不⽅便。
现在可能⼜有⼈会问了,为什么要使⽤编号来指定字符,⽽不是直接指定字符呢?⽐如,字符“A”,为什么要⽤编号65呢,直接⽤“A”不是更⽅便?对于英⽂字母这些常见的字符,直接使⽤字符当然更⽅便,但对于不是经常使⽤或者难输⼊、难显⽰、不显⽰的字符(⽐如积分号、求和符号、零宽度空格、回车换⾏符等),那么使⽤编号就更⽅便了。
⼀个⼆进制⽐特串,⽐如0100 0001,为什么不会被处理为整数65,⽽被处理为字符“A”呢?这与该⽐特串的类型有关,如果类型为整型,则计算机就会被解释为整数65,若为字符型,就会被解释为字符了,同理,若为浮点型,则会按浮点型的规则解释这个⽐特串。
四、Unicode编码模型(Unicode的编码思想)
Unicode编码被分为表1的⼏个层次
1
以上5个层次被称为Unicode编码模型,其实也是Unicode编码实现的步骤,下⾯分别对5个层次作⼀简介,后⽂会分别作详细介绍。
2、第⼀层:抽象字符表ACR(Abstract Character Reertoire)
ACR⽤于确定可以编码的字符的范围(即,确定⽀持哪些字符)
3、第⼆层:编号(编码)字符集CSS(Coded Character Set)
为每个字符编⼀个唯⼀的编号,从⽽形成⼀个庞⼤的“字符编号对”的集合,这个集合就是编号字符集CSS。⽐如,将⼤写字母A编号为整数65,B编号为66等,注意:Unicode字符的编号是使⽤16进制数表⽰的。需要注意的是,编号字符集仅仅规定了每个字符的编号,并未将编号转换为⼆进制串
翻译问题 Coded Character
Set通常翻译为“编码字符集”,但由于此步骤的特征,翻译为“编号字符集”更为贴切,还可避免与之后转换为⼆进制时的“编码”相混淆。
4、第三层:字符编码⽅式CEF(Character Encoding Form,或翻译为字符编码表)
把字符编号编码为逻辑上的码元序列(即,逻辑字符编码),注意:码元序列已经是⼀个⼆进制串了,常见编码⽅式有UTF-8,UTF-
16,UTF-32,本⽂将此步骤的三种编码⽅式统称为Unicode编码。
5、第四层:字符编码⽅案CES(Character Encoding Scheme)
将逻辑上的码元序列映射为物理上的字节序列(即,物理字符编码),字节序列仍是⼀个⼆进制串,此步骤的主要⽬的是确字码元序列的字节序,字节序确定之后就可以直接由计算机处理、存储了,由于UTF-8编码不存在字节序问题,所以使⽤UTF-8编码的字符不需要经过此层。
6、第五层:传输编码语法TES(Transfer encoding Syntax)
将字节序列进⼀步编码处理,以适合于在⽹络中传输。此步骤不是本⽂的内容,不作讲解
五、抽象字符表ACR(Abstract Character Repertoire)
1、抽象字符表是Unicode⽀持的所有抽象字符的集合,⽤于确定字符的范围,即Unicode需要⽀持哪些字符。
2、字符表分为是封闭的字符表和开放的字符表,封闭的字符表不允许添加新的字符,⽐如ASCII字符表;开放的字符表允许不断的添加新的字符,Unicode字符表就是开放字符表,另外,代码页在⼀定程度上也是开放的。
六、编号(编码)字符集CSS(Coded Character Set)
本⼩节很重要,讲解了重要概念:编号、码点、码点空间
1、前⽂已讲过,此步骤的主要⽬的就是为字符编号(或称为编码),此步骤形成的“字符编号对”集合,称为编号字符集CSS
2、易混概念—字符集、字符编号、字符编码
字符集、字符编号、字符编码经常混⽤,这三者在本⽂中有⼀定区别,
字符集是字符与编号对的集合,此处是⼀种狭义的理解,因为,并不是所有编号都⼀定有字符与之对应,详见后⽂。
字符编号是对字符所分配的⼀个数值
字符编码是指将字符编号转换为⼆进制串的⽅法。
3、需要注意的是,编号有多种表⽰⽅式,可使⽤10进制、16进制整数表⽰,也可使⽤坐标的形式表⽰,坐标形式的编号,通常以⼆维表的形式来描述,如图1所⽰。在图1中,字符A的坐标为(0100,0001),其对应的⼆进制数值为0100 0001,转换为10进制为65,即,字符A的编号为10进制的65,⼆进制的0100 0001
4、编号空间(Code Space,或称为代码空间、码点空间)
unicode码和ascii码区别码点空间是指设定的字符编号的上限值,该值通常⼤于等于抽象字符表中的字符数⽬,从0到上限值之间的范围称为码点空间,编号空间可以有多种描述⽅法,⽐如GB2312汉字的编号空间是94*94,ISO-8859-1的码点空间是256或28等,
注意,码点空间还被定义为字符集中所有码点(见下⼀⼩点)数量的总和,其实这两种定义⽅式基本是⼀致的,编号⼀般是⾮负整数,通常情况下,编号上限值就表⽰或者可通过其计算出码点数量总和
5、代码点(Code Point,简称码点)和码点值
码点是指码点空间中的⼀个位置,该位置所代表的数值就是码点值。注意,码点和码点值是有区别的(但是经常混⽤)
注意,码点值的总数(码点空间)通常是⼤于等于字符总数的,这意味着,并不是所有码点值都有⼀个字符与之对应。
Unicode将码点⼤致分为:字符码点、⾮字符码点、保留码点。
字符编号与码点值的区别
字符编号是为字符所分配的码点,使⽤字符编号⼀定有⼀个字符与之对应,但码点值却不⼀定有与之对应的字符,可见,字符编号与码点之间是有区别的(但是经常混⽤)。
6、码点值的表⽰
码点值通常使⽤“U+⼗六进制数”的形式来表⽰,这样,就可以使⽤码点值来表⽰⼀个字符了(虽然有些码点值不⼀定有字符对应,但更直接),⽐如中⽂“汉”字的码点值是U+6C49等,通常将码点值 (如U+6C49) 称为Unicode字符,虽然这样不够准确,但现实中普遍都这样称呼。
7、易混概念----码点与码点值
“码点”和“码点值”是有区别的,码点指的是位置,码点值指的是值。但是,经常使⽤码点表⽰码点值,这应根据上下⽂来区别。
8、特别注意
在Unicode标准中,码点与字符并不⼀定总是⼀⼀对应的,在Unicode标准中,⼀个字符有可能有多个码点,⽐如U+51C9与U+F977都是同⼀个字符“凉”,这主要是为了兼容韩国字符集的标准。
也有可能由多个码点来表⽰⼀个字符,最常见的就是组合字符,⽐如,以下字符
是由基本字符g
(U+0067)和U+0308(这个字符称为组合字符)组合⽽成,虽然以上字符是由两个Unicode码点组成,但现实中,⼈们会认为这是⼀个字符。以上由两个码点组合⽽成的字符称为“⽤户感知字符”(这是Unicode对字符的⼀种理解⽅法)。
9、Unicode字符集的概念
从以上讲解可见,字符集可理解为⼀张或多张⼆维表,表中⾏与列的交点(即,码点)分配⼀个编号(码点值),除了某些特殊码点值外,每个码点唯⼀对应于⼀个字符(注意,并不是每个码点值都有字符与之对应)。现实中,通常直接使⽤码点值代替字符编号,这样做虽然不够准确,但更直接。
本⽂所讲的Unicode字符集是指的码点空间和与之对应的抽像字符表所形成的集合,也就是说,Unicode字符集包含抽象字符表中的字符、与字符对应的码点、以及没有与字符对应的码点。
从以上讲解可以看到,Unicode字符集仅仅为每个字符分配了⼀个代码点(即,编号),但是,并不是每个代码点都有字符与之相对应(因为码点空间通常⼤于等于字符总数),若忽略掉没有对应字符的代码点,则Unicode字符集可简单理解为“为每个字符分配了⼀个数值”,总之,Unicode字符集与计算机并没有直接的联系。后⽂讲解的编码,主要⽬的是把码点转换为⼆进制串,这就牵涉到⼀些算法的问题,⽽且与计算机硬件也有⼀定的关系,所以,编码就会与计算机打交道了,因此,也需要知道⼀些计算机知识,特别是字节序。
七、Unicode字符集的分类-----平⾯
1、平⾯
Unicode字符集被分成多个区,Unicode将“区”称为平⾯
2、Unicode字符集被划分为 17 个平⾯(即,17个区,编号为 0-16 ),且具有以下特点
每个平⾯有216 = 65536个代码点,因此,整个Unicode字符集共有17 × 65536 = 111 4112 个码点。
整个Unicode字符集的码点空间为U+000000 ~ U+10FFFF
每个平⾯的码点范围可表⽰为U+xx0000 ~ U+xxFFFF,其中xx表⽰16进制的0x00到0x10,⽐如,平⾯0的码点范围为
U+000000 ~ U+00FFFF,平⾯2的码点范围为U+020000 ~ U+02FFFF,平⾯15的码点范围为U+0F0000 ~ U+0FFFFF 再次注意:并不是每个码点就⼀定对应有⼀个字符,因为,⽬前Unicode字符集中有很多码点都还未被使⽤。
3、17个平⾯⼜分为以下两类平⾯
①、基本多⽂种平⾯ ( Basic Multilingual Plane,BMP,或称为基本多语⾔平⾯、基本平⾯、第零平⾯、平⾯0)
BMP平⾯位于第0平⾯,代码点范围为U+0000~U+FFFF
BMP平⾯基本包含了世界上正在使⽤的常⽤字符,因此,平常使⽤的字符⼀般都位于BMP平⾯上。
BMP平⾯中的中⽂代码点范围为U+4E00 ~ U+9FA5,该区域被称为CJK统⼀表意⽂字(CJK Unified
Ideographs),包含了 2万多个来⾃中国(包括台湾)、⽇本、韩国的汉字,称为 CJK (Chinese Japanese
Korean) 汉字。注意,象形⽂字属于表意⽂字的⼀种。
专⽤区域:U+E000 ~ U+F8FF(共6400个码点)是BMP平⾯的专⽤区域,被保留为专⽤。
代理区域:U+D800 ~ U+DFFF(共2048个码点)是BMP平⾯的代理区域,该区域在UTF-16编码时会使⽤到。
②、辅助平⾯(或称为增补平⾯)
辅助平⾯被留作扩展之⽤或⽤来表⽰⼀些特殊的字符(⽐如,不常⽤的象形⽂字或远古时期的⽂字等),这些字符通常被称为增补字符。
辅助平⾯位于平⾯1 ~ 16,即码点在U+010000 ~ U+10FFFF范围的字符都是增补字符
辅助平⾯是从Unicode 3.1 开始对BMP进⾏的扩展。
4、辅助平⾯⼜分为以下⼏类
①、第⼀辅助平⾯,也称为增补多⽂种平⾯(Supplementary Multilingual Plane,SMP)
位于平⾯1,⽤于存放拼⾳⽂字(主要为现已不再使⽤的⽂字)及符号,其代码点范围为U+10000 ~ U+1FFFF
②、第⼆辅助平⾯、也称为增补表意平⾯(Supplementary Ideographic Plane,SIP)
位于平⾯2,其代码点范围为U+20000 ~ U+2FFFF,⽤于存放“中⽇韩统⼀表意⽂字扩展区B ~ G”,及中⽇韩兼容表意⽂字增补,这些字符都是罕⽤的汉字、⽅⾔⽤字等字符。
③、第三辅助平⾯,⼜称为表意⽂字第三平⾯(Tertiary Ideographic Plane,TIP),还未正式使⽤,计划⽤于存⼊甲⾻⽂、⾦⽂、⼩篆、中国战国时期⽂字等。
④、第四⾄⼗三辅助平⾯尚未使⽤
⑤、第⼗四辅助平⾯⼜称为特别⽤途补充平⾯(Supplementary Special-purpose Pane,SSP),代码点范围为U+E000 ~ U+EFFFF,其中U+E0000 ~ U+E007F⽤于存放Language tags,U+E0100 ~ U+E01EF⽤于存放Variation Selectors,这些都是控制字符
⑥、第⼗五和⼗六辅助平⾯是私⼈专⽤区,其代码点范围分别为U+F0000 ~ U+FFFFF,U+1000000 ~ U+10FFFF
5、表2为Unicode字符集的分类总结
本⽂作者:黄邦勇帅(原名:黄勇)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。