0%

字符集与字符编码

介绍如下几种概念

  • 字符集
    • 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

包含多种替换规则,如下

以阿拉伯语举例 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,本身就是编码字符集,又是字符编码
  • 不同的字符集转换,需要各自的码表才能进行转换

Ref