苏哲 (suzhe@gnuchina.org) Turbo Linux公司软件工程师 GB18030 是最新的汉字编码字符集国家标准, 向下兼容 GBK 和 GB2312 标准。本文将向您讲述如何在 XFree86 窗口系统中实现对GB18030 标准的支持。 1. 简介 1.1 GB18030 简介 GB18030 是最新的汉字编码字符集国家标准, 向下兼容 GBK 和 GB2312 标准。 GB18030 编码是一二四字节变长编码。 一字节部分从 0x0~0x7F 与 ASCII 编码兼容。 二字节部分, 首字节从 0x81~0xFE, 尾字节从 0x40~0x7E 以及 0x80~0xFE, 与 GBK标准基本兼容。 四字节部分, 第一字节从 0x81~0xFE, 第二字节从 0x30~0x39, 第三和第四字节的范围和前两个字节分别相同。 四字节部分覆盖了从 0x0080 开始, 除去二字节部分已经覆盖的所有 Unicode 3.1 码位。 也就是说, GB18030 编码在码位空间上做到了与 Unicode 标准一一对应,这一点与 UTF-8 编码类似。 目前最新的 glibc 2.2.x 系列已经全面支持了 GB18030 Locale 和 GB18030 与 UCS-4 之间的编码转换, 也就是说在系统层上 Linux 已经可以支持 GB18030 标准了。 下面问题的关键就是怎样让 XFree86 窗口系统也支持 GB18030 标准。 1.2 XFree86 国际化原理简介。 本文介绍的所有内容都基于 XFree86 4.0.3 及其以后版本, XFree86 早期版本未做测试。 XFree86 窗口系统中涉及到国际化的部分主要有字体管理, 文字绘制, 编码转换以及进程间通讯。 具体的编程接口请参阅相关资料, 本文不作更详细的介绍。 1.2.1 字体管理与文字绘制 早期的 XFree86 由于对国际化问题考虑不足, 在字库接口上仅定义了单字节索引和双字节索引两种字库接口, 分别对应 XDrawString 和 XDrawString16 两组函数。 前一组函数使用8位字模索引序列, 后一组函数使用16位字模索引序列。 函数定义分别为: XDrawString(display, d, gc, x, y, string, length) Display *display; Drawable d; GC gc; int x, y; char *string; int length; XDrawString16(display, d, gc, x, y, string, length) Display *display; Drawable d; GC gc; int x, y; XChar2b *string; int length; 注意, 两个函数中的 string 指针指向的并不是编码序列, 而是字模在字库中的索引序列。一般将这个序列使用的编码转化成为字符集(CharSet)编码。 对于 ISO8859-1 等8位编码的西方语言来说, 编码和字符集编码是一样的。 所以可以直接用 XDrawString 显示显示这些编码的字符串。 但对于多字节编码的复杂语言来说就不一样了。 以 GB2312 为例, GB2312 编码(encoding) 的范围为单字节 0x00~0x80, 双字节 0xA1A1~0xFEFE, 而 GB2312 字库的字符集仅覆盖 GB2312 编码的双字节部分, 其编码是将 GB2312 双字节编码中每个字节的第8位置0得来的, 例如, GB2312 编码为 0xA1A1 的字符的字模(glyph)信息在 GB2312 字库中的索引是 0x2121, 而不是 0xA1A1。 早期的 XFree86 系统并不支持 ttf 字体, 对于 XFree86 系统中常用的 BDF/PCF 点阵字体而言, 每种字体使用的字符集编码是固定的, 如中文字库有 GB2312.1980-0, GBK-0, BIG5-0 等字符集, 日文有 JISX0201。1976-0, JISX0208。1983-0 等字符集。 后来人们在 XFree86系统中引入了对 ttf 等矢量化字体的支持, 目前用于 XFree86 4.x 的 ttf 字库模块有 freetype 和 xtt。 由于绝大多数 ttf 字体都直接使用 UCS2-BE 作为字符集编码(字库索引)。 为了和现有 XFree86 系统兼容, 这两个模块都具备编码转换功能, 即可以将传统的字符集编码转换为 UCS2-BE 编码, 从而可以将 ttf 字库虚拟成传统的字库来使用。 为了便于字库管理, XFree86 引入了 XLFD (X Logical Font Discription) 机制来描述字体。 关于 XLFD 的详悉介绍请参阅 XFree86 的相关文档。 为了增强 X 窗口系统对国际化的支持, 在 X11R5 版本中引进了一系列新的字符串绘制函数和字体集的概念。 简单来说, 字体集就是将几种不同字符集的字库组合成一个覆盖多个字符集的新字体。 例如将一个 ISO8859-1 的英文字库和一个 GB2312.1980-0 的中文字库组合成一个字体集, 就可以覆盖 GB2312 编码的所有字符了。 支持国际化的字符串绘制函数主要分为两类 XmbDrawString 和 XwcDrawString。 它们的定义为: void XmbDrawString(display, d, font_set, gc, x, y, string, num_bytes) Display *display; Drawable d; XFontSet font_set; GC gc; int x, y; char *string; int num_bytes; void XwcDrawString(display, d, font_set, gc, x, y, string, num_wchars) Display *display; Drawable d; XFontSet font_set; GC gc; int x, y; wchar_t *string; int num_wchars; 前一类用于绘制多字节编码的字符串, 后一类用于绘制宽字节编码的字符串。 使用这两个函数可以直接绘制当前系统语言编码的多字节编码字符串或者 wchar_t 类型的字符串。 但实际上这两个函数还是将多字节字符串或宽字节字符串拆分并转换成多段不同字符集的编码串, 然后调用 XDrawString 或者 XDrawString16 来显示。 所使用的字库就是字体集中对应的字库。 例如使用 XmbDrawString 绘制 "ABC大家好" 这个GB2312编码的多字节字符串, XmbDrawString 首先会把这个字符串拆分成两部分, 一部分是 "ABC" 对应 ISO8859-1 字符集, 将用字体集中的 ISO8859-1 英文字库来绘制; 另一部分是 "大家好" 对应 GB2312.1980-1 字符集, 将用字体集中的中文字库来绘制。 然后会将这两个字符串分别转换为对应字符集的编码, 转换后的结果为 "ABC" (未变) 和 0x73 0x34 0x52 0x3C 0x43 0x3A (即 "大家好" 的 GB2312.1980-0 字符集编码, 也就是字库索引)。 然后 XmbDrawString 就会分别调用 XDrawString 和 XDrawString16 来显示这两个字符串。 1.2.2 [1] [2] 下一页
|
|