赞
踩
本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)
本文是对《C++语法详解》一书相关章节的增补,以增强读者对字符的理解,因为《C++语法详解》引用的标准过于老旧。
《C++语法详解》网盘地址:
https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg
本文摘自本人所作《Unicode编码和双向算法(bidi)详解》网盘地址
链接:https://pan.baidu.com/s/1LLKv22jQPmeba1XUCm0xoQ?pwd=a3x8
提取码:a3x8
有兴趣的读者可参阅本人所著《C++语法详解》一书,电子工业出版社出版,该书语法示例短小精悍,对查阅C++知识点相当方便,并对语法原理进行了透彻、深入详细的讲解,可确保读者彻底弄懂C++的原理,彻底解惑C++,使其知其然更知其所以然。此书是一本全面了解C++不可多得的案头必备图书。
由于本人能力有限,文中难免有错漏之处,望广大读者指出更正,不胜感激
Unicode又称为统一码、万国码、单一码,是国际组织制定的旨在容纳全球所有字符的编码方案,包括字符集、编码方案等,它为每种语言中的每个字符设定了统一且唯一的二进制编码,以满足跨语言、跨平台的要求。Unicode制定的内容非常多,为便于讲解,本文仅对Unicode字符集和Unicode编码方案重点讲解
历史上,除了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
本文所指的字符是文字和符号的总称,包括文字、数字、字母、标点符号、图形符号等。
表意文字是指将意思置换成形状来表示的文字的统称,所以,表意文字只要看到一个文字的形状就能理解想要表达的意思。表意文字有很多,如汉字、彝文、东巴文等。注意:象形文字属于表意文字中的一种
CJK是中国(Chinese)、日本(Japanese)和韩国(Korean)的缩写,其目的是要把分别来自中文、日文、韩文、越文等,本质和意义相同、形状一样或稍异的表意文字于ISO 10646及Unicode标准内赋予相同编码。顾名思义,CJK能够支持中、日、韩三种文字。
计算机只能处理二进制数字,那么怎样处理字符呢?可以想到的最简单的办法就是在字符和数字之间进行映射(编码),即,只需把字符想办法转换为二进制数字就行了,比如将字符“A”映射为10进制整数65,然后再将65直接映射为二进制数0100 0001,同理,可将“B”映射为66等,这样计算机就能处理字符A了,这里的“映射”在计算机中被称为“编码”,现在的计算机就是使用这种简单的思想处理字符的,只是其具体过程更复杂,至此,可能大家会产生出以下问题:
Unicode编码被分为表1的几个层次
以上5个层次被称为Unicode编码模型,其实也是Unicode编码实现的步骤,下面分别对5个层次作一简介,后文会分别作详细介绍。
ACR用于确定可以编码的字符的范围(即,确定支持哪些字符)
把字符编号编码为逻辑上的码元序列(即,逻辑字符编码),注意:码元序列已经是一个二进制串了,常见编码方式有UTF-8,UTF-16,UTF-32,本文将此步骤的三种编码方式统称为Unicode编码。
将逻辑上的码元序列映射为物理上的字节序列(即,物理字符编码),字节序列仍是一个二进制串,此步骤的主要目的是确字码元序列的字节序,字节序确定之后就可以直接由计算机处理、存储了,由于UTF-8编码不存在字节序问题,所以使用UTF-8编码的字符不需要经过此层。
将字节序列进一步编码处理,以适合于在网络中传输。此步骤不是本文的内容,不作讲解
1、抽象字符表是Unicode支持的所有抽象字符的集合,用于确定字符的范围,即Unicode需要支持哪些字符。
2、字符表分为是封闭的字符表和开放的字符表,封闭的字符表不允许添加新的字符,比如ASCII字符表;开放的字符表允许不断的添加新的字符,Unicode字符表就是开放字符表,另外,代码页在一定程度上也是开放的。
本小节很重要,讲解了重要概念:编号、码点、码点空间
1、前文已讲过,此步骤的主要目的就是为字符编号(或称为编码),此步骤形成的“字符编号对”集合,称为编号字符集CSS
字符集、字符编号、字符编码经常混用,这三者在本文中有一定区别,
3、需要注意的是,编号有多种表示方式,可使用10进制、16进制整数表示,也可使用坐标的形式表示,坐标形式的编号,通常以二维表的形式来描述,如图1所示。在图1中,字符A的坐标为(0100,0001),其对应的二进制数值为0100 0001,转换为10进制为65,即,字符A的编号为10进制的65,二进制的0100 0001
码点值通常使用“U+十六进制数”的形式来表示,这样,就可以使用码点值来表示一个字符了(虽然有些码点值不一定有字符对应,但更直接),比如中文“汉”字的码点值是U+6C49等,通常将码点值 (如U+6C49) 称为Unicode字符,虽然这样不够准确,但现实中普遍都这样称呼。
“码点”和“码点值”是有区别的,码点指的是位置,码点值指的是值。但是,经常使用码点表示码点值,这应根据上下文来区别。
Unicode字符集被分成多个区,Unicode将“区”称为平面
2、Unicode字符集被划分为 17 个平面(即,17个区,编号为 0-16 ),且具有以下特点
①、基本多文种平面 ( Basic Multilingual Plane,BMP,或称为基本多语言平面、基本平面、第零平面、平面0)
②、辅助平面(或称为增补平面)
①、第一辅助平面,也称为增补多文种平面(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字符集的分类总结
本文作者:黄邦勇帅(原名:黄勇)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。