inptr += 2; ++*irreversible; continue; } } *((uint32_t *) outptr)++ = ch;
需要注意的是上面的每行语句后面都有一个“\”符号,这个续行符是为了保证整个函数是一个完整的宏而添加的。为了实现这种转换,还需要相应的编码转换表,而转换函数的具体代码就是从编码转换表中查找到当前GB18030编码对应的系统内码,然后返回这个系统内码。编码转换表一般是从编码的字符映射表生成的,在这个程序中,它应该作为一个或者多个数组的形式而存在。相应地,从系统内码到GB18030编码的转换函数的实现也是类似的,但是有一点区别就是转换后得到的GB18030编码是不定长的,它有单字节、双字节和四字节三种情况,从而会导致这部分的编码转换函数相对复杂得多。在编码转换表方面,需要按照返回的 GB18030 编码长度,对编码转换表进行分段,然后再根据各个段的情况进行分别处理;在编码转换程序方面,需要在返回GB18030编码的同时返回编码的长度,根据编码长度进行相应的处理。这部分的转换函数代码比较复杂,就不再附在本文中,如果想了解可以到http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconvdata/gb18030.c?rev= 1.3&content-type=text/x-cvsweb-markup&cvsroot=glibc页面中得到想要的内容。定义了转换模块、具体的转换函数以及它们使用的转换表,系统就能够正确识别相应字符集的编码了,最后还需要在Makefile中添加GB18030这个编码模块,同时指明它有由哪几个文件编译得到的。对Glibc的这些修改工作完成之后,还需要重新编译整个Glibc,就可以得到支持GB18030编码标准的Glibc库。
2.Locle方面
相对来说,在Locale方面所做的工作就相对简单一些。我们只需要编写一套新的关于GB18030-2000编码标准的charmap Source文件、Locale Source文件 和 Method 文件就可以了。其中Charmap Source文件可以从有关GB18030-2000编码标准的 一些文档中得到;Locale Source文件可以按照原来的GB2312或者GBK的Locale Source文件编写;Method文件也可以使用GB2312或者GBK所使用的Method文件。这三个文件完成之后,使用前面介绍过的localedef工具,就可以生成一个新的locale,我们不妨把它命名为zh_CN.GB18030。 Glibc所做的扩充结合新的zh_CN.GB18030 Locale,在Linux系统上就可以做到内码级地支 持 GB18030-2000编码标准了。现在可以试着把Locale设定为zh_CN.GB18030,然后在程序中调用mbtowc()、wctomb()、mblen()等函数,发现它们均可以正常工作,而且能够识别诸如 0x81308130之类的四字节编码。
3.进一步的工作
前面已经介绍过,GB18030-2000标准在Linux上的完全实现绝对不仅仅局限于内核级的实现,而应该包括基本系统的实现和应用程序的完全支持。在这方面还有许多工作要做,比如: * 字符界面下中文平台的显示和输入 * X Window下GB18030编码文字的显示和输入 * 系统基本命令的支持 * 应用程序的支持 * 网络支持 * 数据库方面的支持
四、小结
Glibc和Locale的扩充综合起来,就可以在Linux上面实现对 GB18030-2000编码的内码级支持,也就是说,Linux就可以正确识别和转换 GB 18030-2000的编码,在内核级别上支持GB18030-2000编码标准。如果想要实现一个完全支持GB18030-2000编码标准的Linux系统,还需要进一步的工作,本文也对它们进行了规划和展望。
参考资料
参考文献
关于本篇文章的参考资料,都是文献书籍。并列出如下: