Skip to content

字符编码与字体技术

character_and_coding

1. 现代字符编码模型 (Coding Model)

统一码 (Unicode) 和通用字符集 (UCS) 提出了全新的编码思路,将字符集与字符编码的概念细化为五个逻辑层面。其核心思想是创建一个通用的字符集,并允许以不同方式进行物理存储与传输。

  1. 抽象字符表 (Abstract Characters):确定系统支持哪些字符(如:汉字“中”、英文字母“A”)。
  2. 编号 (Coded Character Set, CCS):为每个抽象字符分配唯一的编号,即码点 (Code Point)
  3. 码元序列 (Character Encoding Form, CEF):规定码点如何映射为固定大小的逻辑单元(码元),如 UTF-16 使用 16 位单元。
  4. 字节序列 (Character Encoding Scheme, CES):规定码元如何映射为物理层面的字节流,涉及字节序(Endianness)和 BOM 处理。
  5. 传输编码 (Transfer Encoding Syntax, TES):在特定环境下(如 Email)对字节流进行的进一步处理(如 Base64)。

character_and_coding_model


2. 基础编码方案

2.1 ASCII

仅使用 0x00 ~ 0x7F,是目前最普及的字符编码。它扎根于互联网协议、操作系统底层及各类硬件设备中,是现代计算的基石。

2.2 ANSI 与 Code Page

为了支持更多语言,ANSI 编码使用 0x00 ~ 0x7F 表示英文字符,超出此范围的(0x80 ~ 0xFFFF)用于扩展编码。

  • Code Page (代码页):用于解决字节与字符集的映射关系。通过切换代码页,同一段字节流可以代表不同语言的字符。
  • 常见的 GB2312、Big5、Shift_JIS 等均属于此类编码方式。

3. 中文字符编码体系

3.1 GB2312 (GB2312-80)

1981 年实施,是中国国家标准简体中文字符集。采用双字节表示,收录 6763 个汉字。

  • 区位码结构:将汉字划分为 94 个区,每区 94 个位。
    • 01-09 区:特殊符号。
    • 16-55 区:一级汉字(按拼音排序)。
    • 56-87 区:二级汉字(按部首排序)。
  • 编码实现:为兼容 ASCII,将两个字节的最高位置 1,最终范围为 0xA1 ~ 0xF7, 0xA1 ~ 0xFE

3.2 GBK (Kuo Zhan)

汉字内码扩展规范,向下兼容 GB2312,收录 21886 个汉字。

  • 范围:首字节 0x81 ~ 0xFE,尾字节 0x40 ~ 0xFE(剔除 0x7F)。
  • 它是 Unicode 普及前 Windows 平台上最常用的中文编码。

3.3 GB18030

目前最新的国家标准,兼容 GBK,收录 70244 个汉字。采用 1、2、4 字节变长编码:

  • 单字节0x00 ~ 0x7F (兼容 ASCII)。
  • 双字节:兼容 GBK 范围。
  • 四字节:支持 Unicode 全量字符,格式为 0x81-FE, 0x30-39, 0x81-FE, 0x30-39

4. Unicode 与全球化

4.1 字符平面 (Planes)

Unicode 将码点划分为 17 个平面,每个平面包含 216 (65536) 个码点:

  • BMP (0 号平面):基本多文种平面,涵盖绝大多数常用字符。
  • SMP (1 号平面):多文种补充平面,存放 Emoji、古文字等。
  • PUA (15/16 号平面):私人使用区,留给开发者自定义字符。

4.2 常用传输格式

  • UTF-8:互联网主流格式。变长(1-4 字节),无字节序问题。微软习惯在文件头添加 EF BB BF (BOM) 以示区别。
  • UTF-16:Windows 内部、Java 和 JavaScript 常用。变长(2 或 4 字节)。由于涉及双字节单元,必须使用 BOM (FE FFFF FE) 区分大小端。
    • 注:常有人误认为 UTF-16 是定长 2 字节,这源于早期 UCS-2 的限制,现代 UTF-16 通过代理对支持全量码点。
  • UTF-32:定长 4 字节,实现简单但空间浪费严重,极少用于文件传输。

5. 实战:汉字转拼音处理

5.1 实现思路

  1. 数据源:从 unicode.org 获取 Unihan 数据库。
  2. 字典生成:解析 Unihan_Readings.txt 中的 kMandarin 字段,建立 Unicode 码点 -> 拼音 的映射表。
  3. 解析逻辑:将输入字符串拆分为单个 Unicode 码点,查表获取拼音。

5.2 推荐资源


6. 字体文件与渲染技术

6.1 TTF (TrueType Font)

TTF 是一种高性能的矢量字方案,通过数学轮廓描述字形,而非固定像素。

  • 轮廓描述:由一系列点及其连接顺序构成。
    • on-curve:轮廓线经过的实心点。
    • off-curve:用于控制曲线弧度的空心点。
  • 组成线型
    • 线段:连接两个相邻的 on-curve 点。
    • 二次贝塞尔曲线:由 on-curve -> off-curve -> on-curve 构成。
    • 优化:多个 off-curve 点之间可以省略中间的 on-curve 点以压缩体积。

TTF的字形轮廓描述

6.2 光栅化渲染 (Rasterization)

矢量轮廓必须转换为像素点阵(Bitmap)才能在屏幕显示。

  • 非 0 环绕数法则 (Non-zero Winding Rule): 判断像素中心点是否在轮廓内部:从该点引出一条射线,计算与之交叉的轮廓线方向。
    • 从左到右交叉:环绕数 +1。
    • 从右到左交叉:环绕数 -1。
    • 最终环绕数不为 0:该点在内部,需要上色。

TTF 非 0 环绕数法则

  • 走样与优化: 在小字号下,像素对齐会导致笔画模糊或断裂(Aliasing)。现代渲染器使用 Hinting (微调) 技术,强制笔画对齐像素边界,以提升清晰度。

TTF 走样问题示例

TTF 往哪边着色


7. 参考资料 (Reference)