字符编码与字体技术

1. 现代字符编码模型 (Coding Model)
统一码 (Unicode) 和通用字符集 (UCS) 提出了全新的编码思路,将字符集与字符编码的概念细化为五个逻辑层面。其核心思想是创建一个通用的字符集,并允许以不同方式进行物理存储与传输。
- 抽象字符表 (Abstract Characters):确定系统支持哪些字符(如:汉字“中”、英文字母“A”)。
- 编号 (Coded Character Set, CCS):为每个抽象字符分配唯一的编号,即码点 (Code Point)。
- 码元序列 (Character Encoding Form, CEF):规定码点如何映射为固定大小的逻辑单元(码元),如 UTF-16 使用 16 位单元。
- 字节序列 (Character Encoding Scheme, CES):规定码元如何映射为物理层面的字节流,涉及字节序(Endianness)和 BOM 处理。
- 传输编码 (Transfer Encoding Syntax, TES):在特定环境下(如 Email)对字节流进行的进一步处理(如 Base64)。

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 个平面,每个平面包含
- 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 FF或FF FE) 区分大小端。- 注:常有人误认为 UTF-16 是定长 2 字节,这源于早期 UCS-2 的限制,现代 UTF-16 通过代理对支持全量码点。
- UTF-32:定长 4 字节,实现简单但空间浪费严重,极少用于文件传输。
5. 实战:汉字转拼音处理
5.1 实现思路
- 数据源:从 unicode.org 获取 Unihan 数据库。
- 字典生成:解析
Unihan_Readings.txt中的kMandarin字段,建立Unicode 码点 -> 拼音的映射表。 - 解析逻辑:将输入字符串拆分为单个 Unicode 码点,查表获取拼音。
5.2 推荐资源
- Go 语言实现:go-pinyin
- 拼音数据集:pinyin-data
6. 字体文件与渲染技术
6.1 TTF (TrueType Font)
TTF 是一种高性能的矢量字方案,通过数学轮廓描述字形,而非固定像素。
- 轮廓描述:由一系列点及其连接顺序构成。
- on-curve:轮廓线经过的实心点。
- off-curve:用于控制曲线弧度的空心点。
- 组成线型:
- 线段:连接两个相邻的 on-curve 点。
- 二次贝塞尔曲线:由
on-curve -> off-curve -> on-curve构成。 - 优化:多个 off-curve 点之间可以省略中间的 on-curve 点以压缩体积。

6.2 光栅化渲染 (Rasterization)
矢量轮廓必须转换为像素点阵(Bitmap)才能在屏幕显示。
- 非 0 环绕数法则 (Non-zero Winding Rule): 判断像素中心点是否在轮廓内部:从该点引出一条射线,计算与之交叉的轮廓线方向。
- 从左到右交叉:环绕数 +1。
- 从右到左交叉:环绕数 -1。
- 最终环绕数不为 0:该点在内部,需要上色。

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


