中文字符编码区域
上一节举了一个相对简单的例子,主要是解决多看中中西文混搭的显示问题,本节着重讲一下中文古籍生僻字的嵌入。
这里先介绍一下中文字符编码的一些常识。所有的字符都有一个unicode码表,电脑实际上处理的是这个unicode码,然后再从字库里调取对应的字形显示出来,unicode码的数量决定了ttf文件的容量。这里仅介绍中文字符。
GBK
GBK编码,是在GB2312-80标准基础上的扩展规范,使用了双字节编码方案。
目前多看的自带中文字体都是GBK的,支持的范围(u开头表示unicode):
- u3001—u3129:日文假名;
- u4E00—u9FA5:中文GBK区域的汉字;
- uE7E8—uE7F3:指示中文部首结构的字符;
- uE815—uFA29;中文GBK区域补充汉字,多数是偏旁部首。
GB18010
有两个版本:GB18030-2000和GB18030-2005。GB18030-2000是GBK的取代版本,它的主要特点是在GBK基础上增加了CJK统一汉字扩充A的汉字。GB18030-2005的主要特点是在GB18030-2000基础上增加了CJK统一汉字扩充B的汉字。目前多数超大字符集都是2000的格式,也就是支持GBK+扩充A区。
来看看扩充A区的范围:
- u3400—u4DB5:扩充A区汉字;
- u4DC0—u4DFF:八卦图案;
- u2E80—2FDF:部首扩展。
扩充A区主要是在“一”字(u4e00,GBK汉字从它开始)之前码位的汉字,码位不够,扩充B区乃至之后就从GBK码位的后面开始了(中间有空白是因为国家撤销了不少用的极少的字)。 - u20000—2A6D6:扩充B区;
- u2A700—2B734:扩充C区;
- u2B740—2B81D:扩充D区;
- u2B820—u2CEA1:扩充E区;
- u2F800—u2FA1D:扩充F区。
目前国家确定的unicode码表为上述范围,大多数的超大字符集最多支持到扩充B区,而大多数艺术字体只有GBK(甚至有不少缺字)。
字库最大的几个字体
大部分的字体都只支持到扩充B区,只有少数几个支持到扩充F区甚至之后,罗列如下:
- 花园明朝体:收录GBK到扩充F区的所有汉字,不过这个字体是日本做的,所以笔顺可能不太符合国人的习惯;
- 方正宋体超大字符集:只支持到扩充B区,但它应该是国内超大字符集的鼻祖。
- 方正楷体超大字符集:有两个ttf,第一个GBK+A,第二个B区,外带uF0000—uF0019,以及u100000—u10270F的自造字。
- 开心宋体:国学大师网站使用的单字体,应该是用方正宋体为基础修改的版本,除了支持到F区,还增加了uF0000—uF0048共49个自造字,注意这些自造字与方正楷体是不一样的,只不过它们都占用了相同的码位而已;
- 中华书局宋体:古联公司做的字体,也是基于方正宋体修改的版本,分为三个ttf,第一个GBK+A,第二个八卦+B—F,第三个从uF0000—uFD01D,里面有自造字和不少纂体和甲骨文。
中文外挂字库的配置
以杨宽著作集为例,由于涉及上古的一些文献,所以有大量扩充区,甚至不在F区的生僻字。当然大多数生僻字可能可以靠超大字符集来显示,不过对于一本电子书来说,正文完全使用一个超大字符集来显示并不划算。我们看看方正现有的一些超大字符集的体积:
- 兰亭黑18030系列:每个ttf12M;
- 宋一:25M;
- 楷体:19M;
- 细等线:11M。
当一本书的图文只有100M以内的量级时,外挂字库要占用25%甚至以上的体积,实在是非常不理智的一件事。当然我们可以进行字体子集化,但是子集化处理这样大的字库,也是非常花时间的一件事,更不用说sigil嵌入了一个超大字体后,修改和排版都会慢得惊人了。
所以我们有必要采取更有效率的办法。首先我们确定这本书只使用书宋和楷体两种字体(一种字体也可以,用颜色和大小来区分引文也比较省事),然后用一个比较小的ttf文件作为基础,根据所需的生僻字逐渐增加,这样最终的ttf文件也不会变得太大。
我选定了多看自带的书宋和新楷两个ttf进行子集化,重新命名为rsong和rkai,根据上一贴讲的方式定义嵌入的字体:
@font-face {
font-family:"rkai";
src:
local("楷体扩展"),
url(../Fonts/rkai.ttf);
}
@font-face {
font-family:"rsong";
src:
local("宋体扩展"),
url(../Fonts/rsong.ttf);
}
然后将两个扩展字库分别放在正文标签和引文标签字体族的最后,就完成了扩展字库的配置。
但需要注意的是,方正超大字符集的宋体和楷体字重都比较小,笔画比较细,而多看自带的书宋和新楷都相对粗一些,设备上看起来更舒服,所以,在直接挪用字形之后必须进行相应的加工。