iconv转码的内部实现

引用自:

http://www.unixresources.net/linux/clf/chinese/archive/00/00/04/42/44230.html

 

>>1、能否谈谈即将出来的glibc2.2在locale下的特色。我用RH6.2,

与glibc2.1相比, glibc2.2的locale部分可以说彻底改写了, 我试着
总结一下.

1. localedef支持多字节字符(如中文). 过去只能处理单字节, 所以在
中文locale一些需要汉字的地方如时间显示只能用英文代替, 或采用
一些hack的方法(如gbk locale). glibc2.2 locale定义可直接使用
中文.

2. locale定义相对于encoding独立. 以中文为例, 只需一个zh_CN定义,
与GB2312, GBK或GB18030等charmap配合, 即可生成所需locale. 不
在有分别的zh_CN.GB2312或zh_CN.GBK定义. locale定义和charmap
全用unicode, repertoiremap不再存在了.

3. locale的内容有很大改变. 新的locale基于iso技术报告14652. 除保
留原有的6个catogery (LC_CTYPE, LC_COLLATE, LC_MESSAGES, LC_MONETARY,
LC_NUMBER和LC_TIME)外, 增加了LC_ADDRESS(地址写法), LC_MEARSUREMENT(
公制或英制), LC_NAME(人名写法), LC_PAPER(打印纸大小), LC_TELEPHONE(
电话号码格式)和LC_IDENTIFICATION(locale本身一些信息).

4. 对生成的二进制locale文件进行了优化, 使其显著变小.

5. 最重要的是glibc正式支持中文locale, 也就是说只要安装了glibc就有了
中文locale. 过去不支持中文locale的原因主要是localedef不能处理多字节.

此外, glibc2.2增加了一批与i18n有关的函数, 主要是widechar I/O函数, 如
wprintf等. 至此C99, POSIX和XPG等标准所要求的i18n函数, glibc基本全有了.
glibc2.2可以说是第一个全面支持i18n的GNU C库.

希望大家都来测试新的locale. 你需要先安装glibc2.2 (新locale在glibc2.1.x
下编译肯定失败!), glibc2.2 beta可在
ftp://sourceware.cygnus.com/pub/glibc/releases找到, 最新的是2.1.94.
为了以后别骂我, 先声名, 更新glibc是非常危险的一件事, 一个不小心, 系统
可能就boot不起来了. 请谨慎!

>>/usr/share/i18n/locales/en_GB和
>>/usr/share/i18n/locales/zh_CN两文件的大小,相差较大,因此
>>有些迷惑。

为什麽用en_GB? 那是英国的locale! 在RH6.2下 (glibc2.1.3) 或用zh_CN.GB2312,
或用zh_CN.GBK.

>>还有,glibc的运行库运行时是否只需要/usr/share/locale/*的内容。

是. 但glibc2.2将locale的内容移到了/usr/lib/locale下, 以符合FHS标准(我猜).

>>2、能否讲讲glibc的mb*/wc*函数族的运行流程。glibc如何识别和
>>使用/usr/lib/gconv/*.so,
>>我修改和裁减/usr/lib/gconv/下的一些文件,整个机制就不运行
>>了。我想只要zh_CN.GB2312这个
>>环境,如何达到目标。

简单说, mb/wb函数从当前locale中找到charset的名字, 调用iconv函数,
iconv先读进/usr/lib/gconv/gconv-modules, 根据charset的名字找到
应该用的module (.so), 然后装上该module, 由其作真正的转换.

若只要zh_CN.GB2312这个环境, 只需保留/usr/lib/gconv/下的ENC-CN.so,
libGB.so和gconv-modules三个文件. 但我实在不觉得这是个好主意.
有必要时,可能还需要导入环境变量GCONV_PATH=/usr/lib/gconv/


>>3、X Window的XLC_LOCALE和glibc的关系是什么。我听说当系统低
>>层不支持locale时,X Window
>>自己可以提供支持,如何启动X window这部分功能。

系统C库支持locale时,X使用libc的locale系统, 自己只处理如fontset这种
只有X Window才用的locale问题. XLC_LOCALE这个文件理的大部分数据都与
fontset有关. X Window自己地确有locale支持,但非常有限, 没法跟libc的
比. 只是因为以前很多系统没有支持locale的C库, X才不得不自己实现. 现在
很少有人用. 我已经记不清如何用了. 大概齐在编译X时要设一些i18n选项,
XLC_LOCALE中的use_stdc_env设成FALSE, 程序中要调用_Xsetlocale(注意下滑
线). _Xsetlocale是X11R5的函数, 现在X11R6是否还支持我就不知到了.

你可能感兴趣的:(C++,c,linux,.net,C#)