CSDN博客

img hem

linux Q&A of I18N and L10N linux中文问题

发表于2001/6/5 21:20:00  1791人阅读

 

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
   这个在多语言的程序中可能有用,不过我从来没有使用过这个玩意。

阅读全文
0 0

相关文章推荐

img
取 消
img