在 XFree86 窗口系统中实现对 GB18030 的支持(二)
日期:2007年6月1日 作者: 查看:[大字体 中字体 小字体]-
本文是《在 XFree86 窗口系统中实现对 GB18030 的支持》的第二篇,将具体介绍如何在XFree86中实现对 GB18030的支持。
1. 在 libX11 中实现 GB18030 编码转换模块
前面已经介绍了在 XFree86 中支持一种文字编码的关键是在 libX11 中实现支持这种编码的一系列转换模块。 但是由于 GB18030 是单双四字节混和编码, 所以和其它常用的单双字节编码相比, 处理起来比较麻烦。 下面就简要介绍一下在 libX11 中实现 GB18030 编码转换函数的原理。 大家可以参考 XFree86 的源码和相关文档, 以便更好的理解以下内容。
1.1 如何将 GB18030 编码成 Compound Text
看过 Compound Text 文档, 大家就会知道它的最初用途是用来承载单字节或双字节编码的, 并不适合承载编码 GB18030 这样的多字节可变长度编码。其实 Compound Text 所能够承载的编码并不是通常意义的文本编码(encoding),而是字符集编码(CharSet encoding)。而 XFree86 系统最多仅支持双字节宽度的字符集编码。
要想用 Compound Text 承载 GB18030 编码的文本, 就必须先把 GB18030 转换成 Compound Text 所支持的编码。 目前可行的有以下两种方案:
1. 方案一、将 GB18030 拆分成两个双字节编码
首先需要注意的是 GB18030 编码中 0x0~0x7F 范围的单字节部分用 Compound Text 编码后就变成了 ISO8859-1:GL (GL 表示左半部分编码, 即 ISO8859-1 的七位码部分), 所以在拆分 GB18030 编码的时候, 这部分是不计入内的。
拆分 GB18030 的最直接的办法就是把其双字节部分作为一个独立的编码, 然后把四字节部分再编码成双字节, 成为另一个独立的编码。这样我们就可以将 GB18030 文本分解成一个单字节部分, 和两个双字节部分编码成 Compound Text 了。 GB18030 的双字节部分其实基本就是原来的 GBK 双字节编码部分, 它们之间仅有几十个码位的区别。 也就是说我们可以象处理 GBK 编码那样处理 GB18030 的双字节部分。 下面的任务就是处理四字节部分了。
将 GB18030 四字节部分编码成双字节最简单的办法就是把这部分编码从第一个码开始按顺序重新编码, 重新编码后 GB18030 的第一个四字节码 0x81308130 就变成了 0。 依次类推, 我们可以将 GB18030 四字节编码中与 Unicode 3.0 (即 ISO10646 第一平面) 相对应的部分编码成双字节。 但由于这种编码方式最多只能有 65536 个码位, 所以我们不可能将 GB18030 中与 Unicode 3.1 对应的所有码位都编成双字节码。 这也是这种编码方案最大的不足。 另外还有一种办法就是直接将 GB18030 四字节编码转换成对应的 UCS2 编码, 同样可以实现以上目的。
在实际实现时, 我们并没有使用将 GB18030 拆分成两个双字节编码的方案。 因为这种方案实现起来过于复杂, 而且还具有无法向 Unicode 3.1 标准过渡等问题。 实际使用的是下面一种方案。
2. 方案二、将 GB18030 编码成 UTF-8
前面已经介绍过,为了使 XFree86 平稳的从 Compound Text 过渡到 UTF-8,已经在标准的 Compound Text 中加入了一个特殊的模式用来编码 UTF-8文本。在 XFree86 中 Compound Text 编码转换函数会对这种编码模式做特别处理,以便能够正确转换编码在 Compound Text 中的 UTF-8 文本。详细细节请参见 XFree86 的源码(xc/lib/X11/lcCT.c)。
另外前面也介绍过,GB18030 在字汇上和 Unicode 3.0 标准是一一对应的,在码位上也给 Unicode 3.1 标准预留了足够的空间。也就是说,GB18030 编码和 Unicode 3.1 编码是一一对应关系,它们之间可以做双向转换而不损失任何信息。所以我们完全可以将 GB18030 编码的文本先转换成 UTF-8 编码,然后再转换成 Compound Text,而不丢失任何信息,反之亦然。
- [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页
-
- 在 XFree86 窗口系统中实现对 GB18030 的支持(二) 相关文章:
- 在 XFree86 窗口系统中实现对 GB18030 的支持(二) 相关软件
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:vi基本技巧
下一篇:linux音频制作播放不完全指南(mp3,mpc,ape)
精品推荐
热点TOP10
- ·Linux学习手册
- ·在Linux 和FireWire上创建自己的RAC 集群
- ·Linux操作系统源代码详细分析
- ·linux知识大全
- ·Linux/Unix环境下的make命令详解
- ·RPM命令大全
- ·Linux From Scratch安装学习笔记
- ·在Linux下配置TCP/IP
- ·为CanonPIXMAiP1000喷墨打印机安装驱动程序
- ·常见端口表汇总
- ·Pure-FTPd + LDAP + MySQL + PGSQL + Virtual-Users + Quota How To
- ·LINUX 常见问题1000个详细解答
- ·万能声卡驱动(Alsa)的安装方法
- ·hdparm硬盘加速
- ·Linux管理工具介绍
- ·Linux发行版图标大全
- ·Linux中系统整体性能监控工具详细介绍
- ·长篇连载--arm linux演艺---序
- ·Bourne shell编程入门及脚本测试
- ·重安装gentoo 2005.1 for AMD64版经验
特别推荐
- ·Linux管理工具介绍
- ·Linux操作系统源代码详细分析
- ·Linux下用pptp连接VPN服务器
- ·在linux7.1上安装jdk+tomcat+oracle9i笔记
- ·Linux学习手册
- ·学习Linux的八点忠告
- ·深入分析Linux防火墙
- ·UNIX系统后门的安放和日志的擦除
- ·揭开Expect的神秘面纱
- ·万能声卡驱动(Alsa)的安装方法
- ·长篇连载--arm linux演艺---序
- ·为CanonPIXMAiP1000喷墨打印机安装驱动程序
- ·详细讲解Linux系统下ADSL拨号上网方法
- ·使用ImageMagick 的提示与技巧
- ·轻松实现 Linux系统下互联网过滤功能
- ·Linux下一些故障现象以及解决的相关资源
- ·重安装gentoo 2005.1 for AMD64版经验
- ·Linux/Unix环境下的make命令详解
- ·只需十分钟 Linux环境下快速搭建维基网站
- ·常见端口表汇总
