linux Q&A of I18N and L10N linux中文问题
linux Q&A of I18N and L10N linux中文问题 Q&A of I18N and L10N
ideal(2001-05-20 09:54)
〖返回〗〖转发〗
Copyright (C) 2001-2003 Marquis Weng <marquis_weng@bbs.ustc.edu.cn>
This file is part of "Q&A of I18N and L10N" documentation.
This documentation is free documentation; you can redistribute it
and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2, or
(at your option) any later version.
This documentation is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. */
Q. 什么是i18n和l10n?
A. i18n是internationalization(国际化)的缩写,首位的i和末尾的n之间有
18个字母,所以就简写为i18n了;同样的道理l10n是localization(区域化)
的缩写。
Q. OK,我知道i18n和l10n是什么了,不过它们到底有什么用呢?我的目的只不
过是想让我的系统支持中文,没有必要跟我扯这么大的话题吧?
A. 这要从如何支持中文的方法谈起了。现在让程序支持中文一般有三种方法:
1. 使用外挂式中文系统。这种方法基本上只有输入和显示中文的功能,比
如Dos下的UCDOS;windows下的chinesestar;linux下的gce和cce等(
Turbolinux弄的那个UNICON是通过修改内核来支持中文的,因为我没有用
过这个东西,不知道是不是该把它归类到外挂式);X下面外挂式是通过
LD_PRELOAD来实现的,比如Turbo的ZhWinPro,通过设置LD_PRELOAD环境
变量,把X中原来不支持中文显示的函数替换成可以显示中文的函数,从
而得以显示中文。这种方法比较简单,但是功能有限,只能显示中文,而
不能正确处理中文,仍然是把一个汉字当成两个单字节来处理,导致的一
个最明显的结果是在编辑的时候常常会出现半个汉字的情况。而且由于
LD_PRELOAD的限制,不能处理和库做静态连接的程序,还常常导致系统不
稳定,因此这种方法慢慢的已经被抛弃。
2. 直接在程序中加入中文支持。一般是通过修改已有的程序源代码得到的。
比如,现在还比较常用的CXTERM就是通过修改XTERM的代码得到的;再如
中国科学院开发的支持中文的TEX预处理软件CCT(个人感觉,在中文排版
方面,CCT比CJK-Tex要强)。这种方法当然是非常好用的,而且编写出来
的程序,在效果方面甚至可以超过原来的程序。不过,遗憾的是这种方法
效率实在太低了,而且别人的程序每升级一次,旧的跟着修改一次程序。
所以除了极少数程序可以这么搞之外,大部分程序等另外想办法来中文化。
3. 第三种就是这个FAQ的主角i18n+l10n了。I18N为程序编写提供一个架构,
让同样的程序可以适用在各种语言习惯跟编码系统上面,程式设计人员只
要利用这个架构的机制跟准则编写应用程式,就可以在不需重新编译程序
的情况下,自然的支持各式各样的语言。目前I18N的设计的基本原则是,
把程序中处理和语言编码相关的部分资料独立出来。这些资料包括编码系
统的定义(比如大陆的简体中文GB2312;台湾的Big5编码);数字;日期;
货币的格式等。当然,还包括对用户来说可能是最重要的程序的输出信息。
这些和语言环境悉悉相关的资料,被称为locale database。把这部分独
立出来之后,就可以定义和语言环境细节无关的界面,从而使得程序员在
编写程序的时候,可以不被某种特定的语言环境所限制。而在程序执行的
时候,才通过使用者选择的语言环境,联系该语言环境所使用的locale
database 来获得该语言的支持。有了i18n的架构之后,对某种语言的支
持就只需要有该语言的locale database。实现对该语言的支持就叫做
L10N。对中文用户来说,中文化只不过是L10N的一种而已。
Q. 好象很不错的样子,不过我还是有点不太明白到底该怎样中文化。
A. 中文化和其它的语言的区域化没有多少不同。最重要的是需要建立locale
database。对于普通用户来说,系统部分的locale database基本上不用自己
操心,现在已经有了中文的locale database了,而且最近推出的几个linux
distribution都带了中文locale database,你只要安装一下就行了。然后就
只要告诉程序你所使用的语言环境就行了。告诉程序你所使用的语言环境可
以通过设置环境变量LC_ALL来实现。对于中文用户可以设LC_ALL为
zh_CN.GB2312或者zh_CN.GBK。这样操作之后,你就获得简体中文的支持了。
当然,前提是你已经安装了相应的locale database。
Q. zh_CN.GB2312,zh_CN.GBK?很怪的名字,能告诉我是什么意思吗?
A. locale database(简称locale)的名字包含下面几个部分,其中[]里面的是
可选的:
language[_territory[.encoding]][@modifier]
对照来说:zh_CN.GB2312中,zh表示中文的意思,CN表示中国大陆,GB2312
表示所使用的编码方式是GB2312;同样zh_TW.Big5表示台湾的Big5编码的中
文locale。语言(language)通常是两个小写字母,它使用的是ISO 639规定
的语言缩写;地区是两个大写字母表示的,遵循ISO 3166标准(iso639和
iso3166 这两个标准可以从ftp://dkuug.dk/i18n/下面找到)。另外,需要
注意的是,在glibc-2.2中,编码(encoding)部分都采用小写的,即
zh_CN.GB2312按照标准应该写成zh_CN.gb2312,不过由于历史原因,目前这
两者还是通用的。
Q. 我怎么判断是否安装了某个locale?
A. 运行一下locale -a看看你的系统目前安装的所有locale。如果有你想要的
locale的名字,就表示已经安装了该locale。
Q. 我的系统没有安装中文locale,怎么办?
A. 因为不同的系统,有不同的安装方法,我只能说一下我使用过的系统的安装。
因为locale在glibc-2.1以下的系统并没有被实现,所以glibc-2.1以下的系
统应该把升级系统的计划列在你的日程表中了。glibc-2.1本身不带有中文
locale,不过幸好各个linux distribution大多都带了中文locale,比如
Turbo就带了一个locale-zh-0.97-1.rpm的包,安装一下就可以了。对于别的
使用glibc-2.1,但又没有中文locale的linux distribution,比如
slackware-7.0,要安装中文locale办法还是有的,从别的系统里面偷来中文
locale的source,编译安装一下就可以了。Debian的potato里面有一个
zh-locale,就是中文locale包,用dselect或者apt-get来安装一下也就行了。
glibc-2.2已经把中文locale包含在里面,所以不需要特定安装中文locale包。
但是有些系统本身不生成这些locale,需要用户自己来生成。比如Debian的
woody,你就需要修改/etc/locale.gen文件,去掉中文的locale对应行的注
释,然后运行一下locale.gen就能产生中文locale。
Q. 我用的系统是基于glibc-2.1的,已经安装了zh_CN.GB2312的locale,为什么
还不能正常使用这个locale?
A. 一个可能的原因是,你用的distribution没有告诉glibc该如何处理GB2312编
码,解决的方案是在/usr/lib/gconv-modules搜索GB2312的字样,如果没有
找到的话,就在该文档里面寻找"modules EUC-CN"字样,然后在这一行之前
加上如下一行
alias GB2312// EUC-CN//
保存之。这样你的系统差不多就应该支持zh_CN.GB2312这个locale了。
Q. 现在我能够确定我的系统已经安装并支持了中文locale了,但是如何判断我
是否已经设置好了locale环境?
A. 运行一下locale命令,就可以看到现在的locale环境是什么。
Q. oh,运行了一下locale命令,出现一堆输出,
LANG=C
LC_CTYPE="zh_CN.GB2312"
LC_NUMERIC="zh_CN.GB2312"
LC_TIME="zh_CN.GB2312"
LC_COLLATE="zh_CN.GB2312"
LC_MONETARY="zh_CN.GB2312"
LC_MESSAGES="zh_CN.GB2312"
LC_ALL=zh_CN.GB2312
它们都是什么意思?
A. 这些环境变量就是和你使用的语言环境相关的信息。LANG是语言环境,不过
这个变量的等级最低,改变别的环境变量可以使之失效。LC_CTYPE是表明字
符分类应该使用哪个locale的资料,正是一个locale最基本的要素,通常和
该locale使用的编码有关,要使用中文locale的话,一定要设置这个变量。
LC_NUMERIC,LC_TIME,LC_COLLATE,LC_MONETARY分别表示数字,时间,排
序和货币单位使用哪个locale的资料,LC_MESSAGE表示应该使用哪个locale
的信息作为输出,对于中文用户,如果你想看中文界面的话,最好还是设成
中文的。LC_ALL是表示上面所有的资料,只要设置了LC_ALL为某个特定的变
量,其它的会自动跟着变过来,如果没有什么很充分的理由,通常是设置
LC_ALL就够了,不用每个变量一一去设置。glib-2.2中还添加了几个变量,
比如LC_PAPER,LC_ADDRESS等,大体从名字可以猜出意思。
除了这几个环境变量之外,还有一个LANGUAGE的环境变量,设置它之后,
LC_MESSAGES就失效了,LANGUAGE比LC_MESSAGES酷的是,你可以通过设置
LANGUAGE来使用多个locale,比如
export LANGUAGE=de:fr:en
这个在多语言的程序中可能有用,不过我从来没有使用过这个玩意。