当前位置:Linux教程 - Linux - TurboLinux 4.02中文化初探

TurboLinux 4.02中文化初探



         作 者: stable


    前两天装了Redhat6.1, 没有中文很痛苦, 想从TurboLinux
    中偷来中文支持, 顺便了解了一些TurboLinux在中文方面的工作.
    1. 文件系统对 GBK/Big5 codepage 的支持(能够正确访问
    Windows 95/98/NT下中文 长文件名).

    这里需要对内核打补丁, 取来nls_cp936-linux-2.2.0.patch.gz,
    (cp936是大陆的,cp950是台湾的)这个补丁在TLC的站点没找到,
    我从166.111.136.3/pub/linux/driver下去的, 好像与版本关系
    不太大, 我的kernel版本是2.2.10
    将该文件拷至/usr/src,
    # gzip -d nls_cp936-linux-2.2.0.patch.gz
    # patch -p0 < nls_cp936-linux-2.2.0.patch

    到/usr/src/linux下,
    make menuconfig
    到file system -> NLS.. 选择CP936为模块
    从新编译内核, 新内核在cce下就可以看到98分区里的中文文件名了
    这个比较容易(不知FreeBSD有没有这样的补丁,:)


    2. 安装locale
    locale在中文化方面的作用极大, 但似乎没有引起足够的重视,
    TLC 4.02对 locale 的支持, 包括GBK/Big5 locale, 全面支持NLS
    及I18N.
    主要是localedata-zh-0.05-4.noarch.rpm, 将这个包装上,理论上
    就可以使用locale了.
    老于(yumj)(不是那个玉米糊,:P)写了个程序可以用来测试locale是否正常
    #include
    #include
    #include
    char *string = \"测试Locale的软件!\";
    void main()
    {
    int i, l, length;
    char *ptr;
    char cbuf[128];
    wchar_t wcbuf[128];
    setlocale(LC_ALL, \"\"); printf(\"MB_CUR_MAX %d\\n\", MB_CUR_MAX);
    length = strlen(string);
    printf(\"string %s, length %d\\n\", string, length);
    /* mbstowcs() */
    l = mbstowcs(wcbuf, string, 128);
    printf(\"mbstowcs() -> num %d,\", l);
    for (i = 0; i < l; i++) {
    printf(\" %x\", wcbuf);
    }
    printf(\"\\n\");
    /* wcstombs() */
    l = wcstombs(cbuf, wcbuf, 128);
    printf(\"wcstombs() -> length %d, %s\\n\", l, cbuf);
    /* mblen() check */
    for (ptr = string; *ptr; ) {
    l = mblen(ptr, length);
    mbtowc(wcbuf, ptr, length);
    printf(\"ptr %s, mblen %d, wchar %x\\n\", ptr, l, wcbuf[0]);
    if (l <= 0) {
    break;
    }
    ptr += l; }
    }
    //end


    在TLC4.02下locale为en_US:
    MB_CUR_MAX 1
    string 测试Locale的软件!, length 17
    mbstowcs() -> num 17, b2 e2 ca d4 4c 6f 63 61 6c 65 b5 c4 c8 ed bc fe 21
    wcstombs() -> length 17, 测试Locale的软件!
    ptr 测试Locale的软件!, mblen 1, wchar b2
    ptr 馐訪ocale的软件!, mblen 1, wchar e2
    ptr 试Locale的软件!, mblen 1, wchar ca
    ptr 訪ocale的软件!, mblen 1, wchar d4
    ptr Locale的软件!, mblen 1, wchar 4c
    ptr ocale的软件!, mblen 1, wchar 6f
    ptr cale的软件!, mblen 1, wchar 63
    ptr ale的软件!, mblen 1, wchar 61
    ptr le的软件!, mblen 1, wchar 6c
    ptr e的软件!, mblen 1, wchar 65
    ptr 的软件!, mblen 1, wchar b5
    ptr 娜砑?, mblen 1, wchar c4
    ptr 软件!, mblen 1, wchar c8
    ptr 砑?, mblen 1, wchar ed
    ptr 件!, mblen 1, wchar bc
    ptr ?, mblen 1, wchar fe
    ptr !, mblen 1, wchar 21


    在TLC4.02下locale为zh_CN:
    MB_CUR_MAX 3
    string 测试Locale的软件!, length 17
    mbstowcs() -> num 12, 6d4b 8bd5 4c 6f 63 61 6c 65 7684 8f6f 4ef6 21
    wcstombs() -> length 17, 测试Locale的软件!
    ptr 测试Locale的软件!, mblen 2, wchar 6d4b
    ptr 试Locale的软件!, mblen 2, wchar 8bd5
    ptr Locale的软件!, mblen 1, wchar 4c
    ptr ocale的软件!, mblen 1, wchar 6f
    ptr cale的软件!, mblen 1, wchar 63
    ptr ale的软件!, mblen 1, wchar 61
    ptr le的软件!, mblen 1, wchar 6c
    ptr e的软件!, mblen 1, wchar 65
    ptr 的软件!, mblen 2, wchar 7684
    ptr 软件!, mblen 2, wchar 8f6f
    ptr 件!, mblen 2, wchar 4ef6
    ptr !, mblen 1, wchar 21


    这里有个很怪的问题, 装上这个包后,
    在rh6.1下locale为zh_CN, 极不正常,
    MB_CUR_MAX 3
    string 测试Locale的软件!, length 17
    mbstowcs() -> num -1,
    wcstombs() -> length 0,
    ptr 测试Locale的软件!, mblen -1, wchar 0

    在rh6.1下locale为zh_TW.Big5, 要好些
    MB_CUR_MAX 3
    string 测试Locale的软件!, length 17
    mbstowcs() -> num -1,

    ptr 测试Locale的软件!, mblen 2, wchar 8046
    ptr 试Locale的软件!, mblen 2, wchar 5f78
    ptr Locale的软件!, mblen 1, wchar 4c
    ptr ocale的软件!, mblen 1, wchar 6f
    ptr cale的软件!, mblen 1, wchar 63
    ptr ale的软件!, mblen 1, wchar 61
    ptr le的软件!, mblen 1, wchar 6c
    ptr e的软件!, mblen 1, wchar 65
    ptr 的软件!, mblen 2, wchar 8154
    ptr 软件!, mblen -1, wchar 8154


    怀疑TLC对glibc打过补丁, 就用TLC4.02的glibc 2.1.1替换RH6.1的
    glibc2.1.2,得强行替换
    # rpm -e glibc; rpm -i --nodeps glibc-2.1.1-4.i386.rpm
    然后就正常了, 没搞明白, glibc 2.1开始不就完全支持locale了吗,
    还要动什末,:(

    export LC_ALL=zh_CN后, 就中文locale就可以用了,这时如果你在TLC
    下, 运行mc, 菜单就是中文的啦, RH6.1下的mc也是符合i18n的可惜没有
    中文message, 菜单自然不是中文啦, 可以用TLC的mc包换掉RH6.1的.
    另外, 程序的出错提示也是中文的啦, 可以用TLC的gettext换掉rh6.1的,
    运行gettext, 看看中文的提示信息, hehe

    不过TLC作的不彻底, 只提供了很少的几种软件的中文message,不知道其他
    中文Linux的locale作的怎末样

    3. X-Windows的中文化
    按照TLC的说法, 采用freetype zwinpro的外挂方案, 不用改动X-window
    这里比较麻烦,步骤很多:
    (1)安装中文字库
    zh-ttf-1.1-7.i386.rpm
    在/usr/X11R6/lib/X11/fonts/tt/安装华天中文字库

    rpm -ivh zh-ttf-setup-1.1-2.i386.rpm
    在/usr/X11R6/lib/X11/fonts/tt/下, 字库的fonts.dir
    和fonts.alias

    (2)配置Xfs( X font server)
    将路径/usr/X11R6/lib/X11/fonts/tt/加入到XF86config中的FontPath
    列表中去
    同时将该路径加入到/etc/X11/fs/config的catalogue中去
    kill -HUP xfs的pid重起Xfs

    (3)安装Zwinpro 3.0
    zh-pcf和ZWinPro。最好一齐装,他们相互之间有dependencies,也可,rpm -i
    --nodeps。 我用的是北京linux俱乐部的版本,已经有cxterm了. 如果你的rh没有,请
    先安装它, 因为Zwinpro使用了cxterm的输入法,使用zh-pcf的字库.
    Zwinpro由三部分组成:
    输入法chinput,wrap库libZWin.so,字典xdict
    从中文化的角度看, 前两者更重要些。
    用gtk widget的程序很奇怪,明明调用一下gtk_set_locale()就可以有国际化支持,
    但却偏不用(象GXedit),gtk的作者也不在gtk_init()里调用一下。没办法,只好
    硬弄个wrapper.so 用LD_PRELOAD加上去。

    (我先安装的是binary的包,gnome的中文界面出来了,但在xterm中启动chinput时
    X-window跟死了似的,可能是哪个库冲突了)
    还是用TLC站点的繁体版的ZWinpro3.0的source编译(简体版只有2.0版,还不支持
    XIM).再用简体版的配置文件覆盖之(主要是/usr/lib/ZWinpro目录下的
    Chinput.ad, ZWinPro.ad和zwincontrol.rc)
    这样就可以看到chinput的输入条了,:)

    tlc 的 xwindow 也是打过 patch 的,所以把 tlc 的 xfree86 一并拿过来应该
    比较好 :-). tlc 的 xfree86里不仅增加了对 truetype 字体的支持(xtt),而且
    好象还有对 x-locale 的patch. 另外,xfs 读 truetype 中文字体的速度很慢,
    还是别用了。

    (4)设置gtk

    在/etc/gtk里要有gtkrc.zh,没有自己new一个,要有类似下面的语句:
    (我比较懒,直接从TLC拷过来)
    style \"default\" {
    fontset = \"-adobe-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1,\\
    -*-song-medium-r-*--12-*-*-*-*-*-gb2312.1980-0\"
    }

    class \"GtkWidget\" style \"default\" (关键是这行)

    (5)设置环境变量
    export LC_ALL=zh_CN
    export LANG=zh_CN
    export LD_PRELOAD=/usr/lib/libZWin.so

    这时startx进入gnome, 就已经是中文环境了, GXedit可以完美的支持中文, 不会出现
    删除时半个汉字的情况.
    kde的问题比较奇怪, rh6.1上有两个qt lib, qt-1.44和qt-2.01, kde桌面是用
    qt-1.44编译的, 但缺省的却是qt-2.01?
    qt-1.44要支持中文的话,需要打补丁, 我将rh6.1的qt-1.44库换成TLC的打过补丁
    的版本,但kde起不来.
    后来听TLC的人说, 他们是先给qt-1.44打i18n的补丁, 编译通过,再编译
    整个kde src.

    这样看来, 要在rh6.1下拥有中文的kde环境, 要末将TLC的kde包统统弄来, 要末使用
    中文X-server, 外挂方案是不可行啦.不知道BluePoint的中文X-server是怎么回事,
    采用这种方案, 需不需要对qt-1.44打i18n补丁?


    我个人觉得TurboLinux的最大贡献是: gbk locale和zwinpro, 当然与台湾的CLE
    路子很象(big5 locale和xcin), 工作也差不多. 其实象中文man这样的工作也很值得
    作, 不过好像大家都不以为然, 很不屑的样子. Linux要打桌面的话,没有中文的帮助
    怎末说的过去?

    有不对的地方请大家指正

    我的解决办法是,用 tlc 做框架,把其他发行版中比较好的东西般到上面。

    如,我把redhat 6.1的 kde 1.1.2 拿来重新编译了一下(就是用 rpm --rebuild 啦)
    现在用着很好哦!

    另外还把 GNOME 十月版装上了,很爽的说!

    还有一大堆新东东,如 gedit 0.6.1, balsa 0.6, xemacs 21.4, rpm 3.0.3,
    xmms 0.9.5, freeamp 2.0, mtv 1.1.0.6, realplay G2 beta(实在太多,数不过来了)

    这样做的好处是不用考虑 tlc 中那些烦人的中文补丁的移植工作。

    我唯一没有搞成的是 kdevelop, tlc 的 qt-1.44 库和它不兼容。谁要是能做个
    好事,编译一个stable link 的 kdevelop 给咱们用用就好了。
    发布人:netbull 来自:蓝森林