font里面的charset、name,和codepage(代码页)、字符集、字符集编码、系统语言概念说明

首先说明:一般所说的字符集与font的字符集是有区别的。

1、字符集

自然就是只一些字符的集合,字符集是一个虚的概念,并没有涉及到的具体编码格式。

你可以自己定一个字符集,称谓字符集=(你,我,他),当然定义这样的字符集对于程序语言管理是没多大意义的,一般都是根据国家民族语言区定义一个强大的字符集才有实际意义。

不管怎么说,所以,每一种语言,可以根据不同国家、不同民族、不同时期归纳出不同的字符集。如GB2321、GBK、GB18006;甚至根据不同公司的喜好自己出一些字符集,如早期的IBM就这样干的。

2、编码(字符集编码)

      很多人注意到在编码里面同样出现GB2321的说法、不管怎样说都好、你都需要将“GB2321编码”理解为GB2321字符集的编码,编码应该不难理解,其实就是将字符集转换为实际字节数据,例如上面的“称谓字符集”编码可以用“你=0,我=1,他=2”来编码,而如果一段数据为012,那么就是代码字符串“你我他”。

       这里还要注意的是,编码一般会被人理解为一个字符具体的编码值,而多个字符集合起来就是一张编码表,这不难理解,但是有另一个概念需要清楚,就是编码方式,而编码方式则是讲一个字符集是如何去编码的,一个字符集采用不同编码方式当然会出现不同的编码值,但庆幸的是不管、GBK、BIG5、GB2321的编码方式都是默认统一的,东方国家(中国、日本、韩国等)默认采用的是EUC编码方式(就是类似区位码的方式),而GB2312、GBK、BIG5等都是类似这样的方式,这就像GB2321是一张具体的编码表,而这种编码表采用区位码方式来编制。

      例如,那个“称谓字符集”是一个一维的表,可以用0,1,2这样简单的数字去编码,而很多时候字符集是一个二维(如GBK)或者多维(如UNICODE,当然UNICODE也是一个二维表,只是一个表里面又可以根据实际方式看做是多个表的集合,多维表都可以分解成1维表,这些只是让字符分布区域更清晰而已)的表,因此,多维表中,一个二维表虽然也可以用1,2,3,4那样的数字去编码,但是明显不利于程序的查找运算,所以一般都采用类似坐标的(X,Y)那样的编码,对于汉字来说就是区位码的方式去编码了。

     同样的,Unicode是一种编码方式,根据unicode约定的编码方式可以出现不同的处理方法,也就是存在UTF8,UTF32的区别了。

     可以这样理解,编码方式是一种规范,而一种规范下面可能还会出现一些子规范,扩展规范等等,而具体的编码格式就是规范的一种实现。

      关于编码表里的内容,就需要去查询相关资料,继续下面的概念codepage。

3、codepage(代码页)

上面提到的内容,如果理解清晰的话,可以得到这样一个结论,一个字符集编码在系统中会被存储成一张字符集的编码表,这张编码表有一个名称,如我们叫他GB2321。

当系统中存在多个这样的编码表时,需要为不同编码表指定一个编号,方便查找,所以就出现了代码页,关于代码页这个翻译名称,我相信会令刚接触到的人头痛,实际上就是系统字符集编码表的编号列表,如GB2321是936,BIG5是950,为什么会到九百多,是否意味着这之前已经按顺序存在了900多张编码表,这个我们不管,我们只要有这个编号就可以为字符找到一个匹配的编码表就行了。

关于这张编号列表,在MSDN里可以查找到。

需要注意的是系统并不可能安装所有的编码表,因此,有时候你在API中传入指定的codepage(即编号)时,会失败,因为系统中找不到对应的编码表(即一般说的字符集)。

 

4、系统语言

        这个可能比较好理解,系统语言是对windows系统这个大型应用程序的一个语言设置功能,这个功能可以影响到货币、时间、一些按钮默认文字等等。

        有人会发现,这个系统语言里面的中文细分到什么简体中文,香港、台湾、新加波之类的,这跟Codepage里的简体中文(GB2321)有什么联系,其实只要细想一下就可以知道,中国大陆、新加波采用的是简体中文,香港、台湾使用的是繁体中文,因此很清晰的我们看到,一个简体中文字符集可以给不同地区使用,但不同地区却存在一些细微的不同情况,如时间,肯定就是不能一样的,因为时区不同。因此,就出现了根据不同地区可选择不同系统语言这个设置功能,但是这个我们不需要太烦恼,不同系统语言在系统中都会自动选择一个默认字符集(即默认的编码表,一般说是默认的codepage),但很多人都会利用系统语言为程序选择程序的字符资源,其实一般情况下根据系统默认的codepage就行了(GetACP)。

 

5、font里面的charset

这个地方理解的人会很明白,不理解的人会很混乱,因为这里的charset字面上就是字符集的意思,这个字符集跟上面的字符集、还有字符集编码表(codepage)有什么区别,为什么同样的GB2321有这不同的值(FONT的charset里是134,codepage是936),如果一样是对应的,那font的charset是一个byte类型,怎么可能足够表示那么多的codepage。

      虽然我不能肯定,但是我想,windows系统是被分成很多模块给不同部门去开发的,因此开发系统font的部门为不同字符集编制了一张编号列表,而codepage部门也为不同字符集编制了一张编号列表,因此出现了同样的字符集却编号不相等的情况。

     而且,站在font的研发设计角度,可以看出一个很明显的问题,CodePage里面单单希伯来语系就有十多个代码页,而相同的希伯来语系字母一般都是通用相同的,所以在font设计时根本没必要为每个代码页分配一个字符集,只要相同语系就用同一个就够了,而世界上现有的语系还远远达不到255个。

    同样的,从目的角度来考虑,font是为了显示文字,codepage是为了存储文字,两者存在一定的联系,但却不是1对1的联系,而是可以1对N的联系,也就是说,不同的codepage可以使用同一个font来显示。

     即使仍然无法理解,也没关系,我相信在font的charset里设置为GB2321时,系统内部应该会根据这个去查找到对应的codepage的。而我们一般选择default charset,那系统就会自动选择当前默认的codepage去解析编码了。

6、font里面的name

这个name我们可以选择宋体,隶书等等,因此我们很容易理解到这个就是字体,或者说字形。

我们经常会看到一些说在系统安装字体,或者为word安装一些z字体之类的。

这里的字体是一个资源包,这个资源包里,会指明这个包支持那一张编码方式,同时为不同编码方式的字符集映射出一张字形表,这张字形表包含了描述怎样去画出一个字的数据。因此我们要在系统显示一个字时,其实就是让系统画出一个字,我们传给系统的是一个编码,如果这个编码是GB2321这张编码表里面的一个编码,我们就得告诉系统我们使用的GB2321这张表,使用的是codepage为936,然后font部门开发的那个字体功能,就会在这个字体资源包里去获取到这个编码对应那个字的描述数据,再画出来。因此一个相同的编码,可以画出不同的字体来,也就是说同样是GB2321的charset,我们可以选择不同的name来显示文字。

 

 

   

 

posted on 2011-03-28 11:49  峋山隐修会  阅读(2299)  评论(2编辑  收藏  举报

导航