为了更好地对国际化和本地化进行支持,Linux系统 提供了符合Posix标准的 NLS(National Language Support)子系统。该子系统建筑在基于ASCII码的Linux核心上,为世界上不同地域、不同语言环境的应用提供国际化本地化支持。系统中所有支持多国语言的实用程序,包括X Window都是建立在这个基础上。在此基础上,可以建立支持各种不同的语言文化的民族特征数据库(LOCALE)、输入方法(IM)、字体(FONT)和消息机制(MESSAGE)等。在NLS子系统中,Glibc函数库中提供的与代码集相关的多字节字符与宽字符处理函数是Linux实用程序支持国际化本地化的核心,通过这些函数,实用程序把英文与各种本地文字同样处理;而 Locale 则是本地化工作的一个基石,因为不管是Glibc,还是系统的其它部分,都是通过读取系统当前的 Locale 设定来识别 当前的本地化区域,从而使用正确的字符映射表和消息函数。
2.Glibc的转换模式概念
libc对多字节编码的支持非常灵活和自由,它通过一种"转换模式"来实现。目前的Glibc采用UTF-8作为处理码。当接收到外部输入的多字节字符时,系统首先根据当前的 Locale 确定所使用的字符集,然后查找从当前字符集到UTF-8之间的转换模式,根据这种转换模式把输入的多字节字符转换为相应的UTF-8字符。相反,当需要输出字符时,系统再查找从UTF-8到当前字符集之间的转换模式,按照这种模式把要输出的UTF-8字符转换为当前字符集中的多字节字符。在Glibc内部,有一个gconv_modules的转换模式列表。这个列表作为一个文件的形式存在于/usr/lib/gconv 目录下。对于每种具体的转换模式,Glibc把它们的转换表和转换函数编译为一个独立的共享文件(.so),比如支持GB的转换模式的共享文件名为libGB.so,支持Big5的共享文件名为 libBIG5.so。当应用程序调用到Glibc中有关编码转换部分的函数时,Glibc首先从gconv_modules 这个转换模式列表中查找所应该采用的转换模式,然后把相应转换模式的共享文件调入内存。这种动态装载的方式,使得添加或者删除转换模式非常自由和方便,而且当Glibc 支持越来越多的编码时,libc.so这个文件本身并不会变得异常庞大。
3.Glibc对多字节字符和宽字符的转换处理