免费聊天不充值软件,seo网站建设课程,毕业设计网站开发的中期报告,为什么不推荐大家去外包公司一、字符编码方式CEF的选择
1.
由于Unicode字符集非常大(并且作为开放字符集还在不断扩展之中)#xff0c;有些字符的编号(即码点值)需要两个或两个以上字节来表示#xff0c;而要对这样的编号进行编码#xff0c;也必须使用两个或两个以上字节。
比如#xff0c;汉字“…一、字符编码方式CEF的选择
1.
由于Unicode字符集非常大(并且作为开放字符集还在不断扩展之中)有些字符的编号(即码点值)需要两个或两个以上字节来表示而要对这样的编号进行编码也必须使用两个或两个以上字节。
比如汉字“严”的Unicode编号以十六进制数表示为4E25转换成二进制数有15位(100 1110 0010 0101)对“严”这个字符的编号进行编码的话至少需要2个字节。表示其他更大编号的字符可能需要3个字节或者4个字节甚至更多。
2.
这带来两个问题
一是如何才能区别Unicode字符和ASCII字符的编码计算机怎么知道三个字节表示的是一个字符而不是分别表示三个字符呢
二是我们知道英文字母只用一个字节来编码就够了而如果Unicode统一硬性规定每个字符都用两个、三个或四个字节来编码那么每个英文字母编码的前面都必然有一个、两个到三个字节全是0这对于存储和传输来说是极大的浪费。
这就涉及到了字符编码方式CEF的选择问题。Unicode字符的编码方式目前最常用的是这三种UTF-8、UTF-16、UTF-32。在具体介绍这些编码方式之前需要再次深入了解两个概念——码点(Code Point)与码元(Code Unit)。 二、码点
1.
一个字符集一般可以用一张或多张由多个行和多个列所构成的二维表来表示。
二维表中行与列相交的点称之为码点(Code Point代码点)也称之为码位(Code position代码位)每个码点分配一个唯一的编号称之为码点值或码点编号除开某些特殊区域(比如代理区、专用区)的非字符码点和保留码点每个码点唯一对应于一个字符。
因此除开非字符码点和保留码点码点值(即码点编号)通常来说就是其所对应的字符的编号所以码点值有时也可以直接称之为字符编号虽然不够准确但更为直接。
2.
字符集中所有码点数量的总和称之为编号空间(Code Space又被称之为代码空间、编码空间、码点空间、码空间)。
码点值最初用两个字节的十六进制数字表示比如字母A的Unicode码点值为0041常写作U0041这种形式称为Unicode码点名称不严格地来讲也可称之Unicode字符名称(因为存在着非字符码点和保留码点并非每个码点都分配了字符所以这种称呼不够准确不过目前更为普遍)。
3.
后来随着Unicode字符集的不断增补扩大(比如现在的Unicode字符集至少需要21位才能全部表示)码点值也扩展为用三个字节或以上的十六进制数字表示。
例如ASCII字符集用0~127这连续的128个数字编号分别表示128个字符。GBK字符集使用区位码的方式为每个字符编号首先定义一个94×94的矩阵行称为“区”列称为“位”然后将所有国标汉字放入矩阵当中这样每个汉字就可以用唯一的“区位”码来标识了。例如“中”字被放到54区第48位因此其区位码(字符编号)就是5448。
而目前Unicode标准中将字符按照一定的类别划分到0~16这17个平面(Plane层面)中每个平面中拥有2^16 65536个码点因此目前Unicode字符集所拥有的码点总数也就是Unicode的编号空间为17*655361114112。 注意网络上的很多文章中代码点、码点、码点值、码值、代码位、码位、字符码、Unicode码、字符编号、字符编码、编码方案、编码方式、编码格式等等概念经常互相代替混用让人困惑。
笨笨阿林原创文章转载请注明出处 三、码元
1.
在计算机存储和网络传输时码点值(即字符编号)被映射到一个或多个码元(Code Unit代码单元、编码单元)。
码元可理解为字符编码方式CEF(Character Encoding Form)对码点值进行编码处理时作为一个整体来看待的最小基本单元(或称为最小基本单位)。
2.
为什么非要引入“码元”这个概念或者说为什么非要强调“码元”这个概念
码元某种程度上可认为对应于高级语言中的基本数据类型。而高级语言层面的基本数据类型若要更深入一步地来讲实质上对应于机器硬件层面(如汇编语言层面)的数据类型byte字节、word字、dword双字等在硬件中的表达与处理机制。
之所以要强调“码元”的概念是因为字符编码作为一串数字序列最终还是得通过机器硬件层面的数据类型来表示。
而码元的实质就是机器硬件层面的数据类型不同的码元代表着不同位数的数据类型。当字符编码方案设计人员基于某种考虑(如时间复杂度、空间复杂度等)为某种字符编码方式CEF选择了某种码元时其实质就是选择了某个位数的数据类型。
数据类型在机器硬件层面上来看只有作为一个整体来处理的二进制数字位数上的不同(如byte字节、word字、dword双字等汇编语言的数据类型都是二进制数字值只是位数不同而已)而并没有高级语言层面上的数值、布尔、字符等语义的不同毕竟本质上来讲计算机只“认识”由0和1组成的数字。
正因为如此字符编码方案设计人员在设计字符编码方式CEF时必然要选择一种机器硬件层面上某个位数的数据类型(如byte字节、word字、dword双字等)来表示不是选择这个位数的数据类型就是选择那个位数的数据类型。当然这种选择会基于各种考虑比如时间复杂度、空间复杂度等不过一旦选择了某种数据类型其所选择的数据类型位数上的不同同时也就体现为了码元位数上的不同。
所以不同位数的码元实质上是机器硬件层面上不同位数的数据类型。而机器硬件层面上为什么要设计不同位数的多种数据类型出来这是另一个话题了有兴趣可参看有关硬件方面的专著。
3.
由于数据类型有单字节与多字节之分所以码元也有单字节与多字节之分而多字节数据类型由于历史的原因存在着字节序的大端序(Big-Endian)与小端序(Little-Endian)之分因此多字节码元也存在着大端序与小端序之分(具体详见前文中有关字节序的解释注意单字节数据类型是没有字节序的问题的所以单字节码元也就没有字节序问题)。
这就是之所以要强调“码元”这个概念的关键原因。
4.
对字符编号(即字符码点值)进行编码的具体实现方式——字符编码方式CEF就是由一个或多个码元这样的最小基本单元构成的。
最常用的码元是8位(即1字节)的单字节码元另外还有16位(即2字节)和32位(即4字节)两种多字节码元分别相当于汇编语言中的byte字节、word字、dword双字以及C中的无符号整型BYTE、WORD、DWORD。
(注 在VC6.0中这三种数据类型的定义分别为 typedef unsigned char BYTE; // 1个字节 typedef unsigned short WORD; // 2个字节 typedef unsigned long DWORD; // 4个字节)
笨笨阿林原创文章转载请注明出处
5.
于是三种码元对应就有了Unicode字符编号的三种UTF编码方式(即Unicode码转换格式Unicode Transformation Format或称通用字符集转换格式UCS Transformation Format) UTF-8即8-bit Unicode/UCS Transformation Format UTF-16即16-bit Unicode/UCS Transformation Format UTF-32即32-bit Unicode/UCS Transformation Format。
或者反过来说Unicode字符编号的三种UTF编码方式(UTF-8、UTF-16、UTF-32)分别采用了不同的码元(单字节、双字节、四字节)来编码。 例如“汉字”这两个中文字符的Unicode字符编号是0x6C49和0x5B57其三种UTF编码在VC6.0中可按如下定义进行“模拟” 6.
注意这里之所以说是“模拟”其中的一个重要原因如前文所述从本质上来讲机器硬件层面上的所有数据类型只存在着被视作一个整体来处理的比特序列(即二进制序列)的位数不同之分不存在着高级语言层面上数据类型的数值、字符串、布尔值等的语义不同之分。
因此机器硬件层面上的数据类型与高级语言层面上的数据类型严格来讲在含义上还是有着很大不同的。当然高级语言层面上的数据类型最终还是会被转化为机器硬件层面上的数据类型毕竟计算机只“认识”由0和1所组成的比特流。可同时参见前文中有关字节序的解释
7.
这里用BYTE、WORD、DWORD分别表示无符号8位整数、无符号16位整数和无符号32位整数因而UTF-8、UTF-16、UTF-32可认为分别以BYTE、WORD、DWORD作为码元。
“汉字”这两个中文字符的UTF-8编码需要六个BYTE(共6个单字节码元)大小是6个字节UTF-16编码需要两个WORD(共2个双字节码元)大小是4个字节UTF-32编码需要两个DWORD(共2个四字节码元)大小是8个字节。
由于多字节数据类型的数据在计算机存取时存在一个字节序的问题因此UTF-16、UTF-32这两种编码方式所编码出来的逻辑意义上的多字节码元序列在映射为物理意义上的字节序列时字节序列的字节序因系统平台的不同而不同。
前面已经多次强调过了这里再次特别强调一下由单字节数据类型所组成的多字节数据是不存在字节序的问题的。因此采用单字节码元进行编码的UTF-8编码虽然ASCII字符为单字节编码而非ASCII字符却是多字节编码的但却并不存在字节序问题这是跟同样为多字节编码、但却采用多字节码元的UTF-16、UTF-32编码的不同之处。详见下表所列。 Unicode字符集三大编码方式(UTF-8、UTF-16、UTF-32)比较一览表 笨笨阿林原创文章转载请注明出处 【预告下一篇将重点讲解UTF-8编码方式与字节序标记(BOM)敬请关注】