介绍如下几种概念
- 字符集
- Unicode
- GB2312
- GB18030
- 字符编码
- UTF-8
- UTF-16LE
- UTF-16BE
- 字库
- cmap — Character to Glyph Index Mapping Table
- GSUB — Glyph Substitution Table
Character Sets
字符集是标准,是一个系统支持字符的集合,包括通用和地区性标准,例如
Character Encoding
字符集是字符的集合,字符编码用于定于字符集中的字符如何编码为特定的二进制数据,以便于在计算机中存储,是定义在字符集上的映射规则
术语字符编码(character encoding),字符映射(character map),字符集(character set)或者代码页,在历史上往往是同义概念,即字符表(repertoire)中的字符如何编码为码元的流(stream of code units)–通常每个字符对应单个码元。
字库
所有可读或可显示字符的数据库,是信息的集合
cmap
cmap
表是用于将字符编码映射到字形索引的表,可以使用工具导出
$ ttx -t cmap Font.ttf
例如,编码到字形的映射
<map code="0x405" name="afii10054"/><!-- CYRILLIC CAPITAL LETTER DZE -->
<map code="0xfedf" name="afii62817"/><!-- ARABIC LETTER LAM INITIAL FORM -->
<map code="0xfe82" name="afii62753"/><!-- ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM -->
GSUB
GSUB — Glyph Substitution Table
GSUB
表用于提供替换规则
$ ttx -t GSUB Font.ttf
包含多种替换规则,如下
- Single
- Multiple
- Litigation – 连写
以阿拉伯语举例 Litigation
<LigatureSubst index="0" Format="1">
<LigatureSet glyph="afii62817">
<Ligature components="afii62818,afii62828" glyph="afii64184"/>
<Ligature components="afii62818,uni06C1" glyph="afii64184"/>
<Ligature components="afii62753" glyph="afii62834"/>
<Ligature components="afii62754" glyph="afii62836"/>
<Ligature components="afii62756" glyph="afii62838"/>
<Ligature components="afii62760" glyph="afii62840"/>
<Ligature components="glyph1343" glyph="glyph1656"/>
<Ligature components="glyph1345" glyph="glyph1658"/>
<Ligature components="glyph47" glyph="glyph1660"/>
<Ligature components="uniFB51" glyph="glyph1672"/>
</LigatureSet>
</LigatureSubst>
上述连写规则中 afii62817
+ afii62753
输出为 afii62834
,即 ﻟ
+ ﺂ
输出 ﻟﺂ
关系
- 字库,决定了整个字符集能够展现表示的所有字符的范围
- 字符集,用一个编码值
code point
来表示一个字符,这个值称为字符对应于编码字符集(如:Unicode、ASCII)的序号 - 字符编码,是字符集和实际存储数值之间的转换关系。字符,是根据字符编码方案转换为一个二进制数值存储在计算机中
- 编码字符集Unicode,有UTF-8、UTF-16、UTF-32、UCS-2、UCS-4等多种字符编码
- 编码字符集ASCII,本身就是编码字符集,又是字符编码
- 不同的字符集转换,需要各自的码表才能进行转换