如果是初次安装Gentoo 系统与配置中文环境,在读接下来内容之前,建议首先阅读Gentoo Linux Localization Guide。
Locale
locale 名称是一个具有命名约定、带有格式的字符串,其实质是其背后对应的字符集(codeset)。这里有一篇文章 关于locale的设定 Simple HOWTO 可以帮助理解locale ,虽然我并不完全同意文中的所有 观点。
使用不带任何参数的locale命令可以查看当前系统中与locale 有关的变量,以及它们所采用的locale 名称。
$ locale
LANG=en_US LC_CTYPE=zh_CN LC_NUMERIC="en_US" LC_TIME="en_US" LC_COLLATE="en_US" LC_MONETARY="en_US" LC_MESSAGES="en_US" LC_PAPER="en_US" LC_NAME="en_US" LC_ADDRESS="en_US" LC_TELEPHONE="en_US" LC_MEASUREMENT="en_US" LC_IDENTIFICATION="en_US" LC_ALL=
在Gentoo 手册 6. 安装Gentoo基本系统 最后一节,作为可选,简单的介绍了如何生成locale。Gentoo 提供了/etc/locale.gen 文件,用于指定为glibc 生成哪些locale,籍此来控制生成的locale 数量,减小系统体积。查看当前系统中已经生成并可用的locale 有哪些,使用以下命令:
$ locale -a
C en_US en_US.utf8 POSIX zh_CN zh_CN.gb2312 zh_CN.gbk zh_CN.utf8
所有生成的locale 会被放在 /usr/lib/locale/ 下面的子目录,并且与locale 名称同名(除字符集部分的大小写)。(由于历史原因,C 与POSIX 是2个很特殊的locale)
$ ls -1 /usr/lib/locale/
en_US en_US.utf8 zh_CN zh_CN.gb2312 zh_CN.gbk zh_CN.utf8
locale.gen 文件内容具有如下格式,空格之前是locale 名称,locale 名称中可以不包含字符集的部分,空格之后是所对应的字符集。
en_US ISO-8859-1 en_US.UTF-8 UTF-8
作为中文用户,为了系统可以正确的识别、显示并处理中文字符,必须生成与中文字符集有关的的额外locale。字符集可以采用以下之一:
- GB18030
- GBK
- GB2312
- UTF-8
其中除UTF-8 是Unicode 解决方案以外,其它三个是父子集关系,其中GBK18030 最为完整,但仍然建议按以下格式,添加GBK 与GB2312 字符集相关的locale 到locale.gen 文件:
en_US ISO-8859-1
en_US.UTF-8 UTF-8
zh_CN GB18030
zh_CN.GBK GBK
zh_CN.GB2312 GB2312
zh_CN.UTF-8 UTF-8
为什么不单独使用最完整的GB18030 字符集?理由是为了向下与一些较早的应用程序保持兼容,这个方法来自于 最精简有效的 glibc locales 设定。
如果见到有些文章介绍使用/etc/locale.build 文件和不同的格式做类似的事情,不要奇怪,请用以下命令查看你的glibc 版本,如果大于等于glibc-2.3.6-r4 ,那么请用本文的文件名与格式,否则升级glibc 或者按他说的做。
$ emerge -s %^glibc$
* sys-libs/glibc Latest version available: 2.6.1 Latest version installed: 2.6.1
设置locale 有关的环境变量
对于中文用户,一般可以分为2种
- 一般性中文要求,仅要求系统具有中文的处理能力。
要求操作系统以及应用程序能够正确显示并处理中文字符,包括文件名、文本文件内容等,并且可以输入中文。 - 全面性中文要求,要求中文界面。
在一般性要求之外,还要求操作系统以及应用程序的菜单、选项、以及消息等均尽可能以中文进行显示。
以上2种情况,分别对应了2种典型的locale 环境变量设置。
一般性中文要求
很多软件开发者,或者在国外的中文用户,会采用这种方案,好处是:
- 有助于测试软件
- 避免术语翻译不当或者语言习惯所带来的困扰
- 在不影响中文处理能力的前提下,最大化英文的使用范围
推荐的环境变量配置:
export LANG=en_US export LC_CTYPE=zh_CN
全面性中文要求
大部分普通用户会采用这种方案,对应的环境变量配置:
export LANG=zh_CN export LC_ALL=zh_CN
这份指南中说明了所有LC_* 和LANG 变量的作用与关系,额外设置LANG,也是为了对个别不支持LC_ALL 的应用程序保持兼容性。
建议将上述变量设置在日常用户的profile 当中,比如:/home/user/.bash_profile,不建议设置在系统级别,对于Gentoo 这个文件是:/etc/env.d/02locale
G_BROKEN_FILENAMES
G_BROKEN_FILENAMES 是一个与Glib 有关的环境变量,把它作为小标题是因为它十分关键,曾因为它带来了很多困扰。
我们周围几乎所有的Windows 系统都设定为使用GB 编码中文文件名,而不是Unicode,任何Unicode 的编码的中文文件名在这些Windows下都会显示为乱码。因此我们与这样的Windows 系统交换包含中文文件名的文件,最好的方案就是也同样使用GB 编码文件名,这样就不会带来显而易见的麻烦。
通过以上的locale 设定,已经可以看出,我们的确在设定一个GB 编码的中文Gentoo ,而不是Unicode Gentoo,但总有一些事情出乎我们的意料。Gnome 以及几乎所有应用程序(已知除Gnome Terminal 以外)会无视以上的locale 设定,仍然使用UTF-8 编码中文文件名,以Nautilus 为代表,虽然他们可以同时正确的显示与处理GB 与UTF-8 编码的文件名,但另外的一些应用程序会说不,比如Gnome Terminal, Krusader 等等,其他Windows 用户或者FTP 用户也会抱怨。
要解决这个问题,就需要设置:
export G_BROKEN_FILENAMES=1
或者
export G_BROKEN_FILENAMES=yes
设置这个变量后,需要重新启动系统才能生效,或者至少logout 之后重新启动X Window,比如kill 掉X 后回到命令提示符,logout 之后重新login,再执行一个startx。
有关这个变量作用的更多信息,请参考Display Name of Filename in Glib 。
中文输入法 Scim
Linux 下的中文输入法有很多,Xsim, Scim, Chinput, Xcin, Fcitx等等,我现在使用Scim ,其功能类似Windows下的紫光输入法,可以整句输入,也会动态加入新的词组并调整词频,但其智能性与现今Windows 平台的搜狗或者Google 输入法还有差距。
Scim for Gentoo 安装过程比较简单,我使用gnome 环境,没有安装kde,但安装了几个特别需要的kde 应用程序,因此,我的系统上也有qt3,qt4 以及kde 应用所必需的包。
For gnome
首先,要让Scim 在gnome 环境工作,需要以下步骤:
- 在make.conf 的USE 变量中加入 nls cjk unicode,如果它们还不在的话。
- 为了安全起见,执行以下命令来检查是否有软件包会被这些新的USE 变量影响,如果有的话,那么就继续执行,否则退出即可。
# emerge -av --newuse world
- 执行以下命令安装Scim
# emerge -av scim scim-pinyin
- 设置以下环境变量(对于gnome 环境未设置也没有发现问题):
export XMODIFIERS=@im=SCIM #case matters for this variable! export GTK_IM_MODULE=scim export QT_IM_MODULE=scim
重启系统,即可以在gnome 应用中使用ctrl+space 调出Scim 使用。
For kde
为了能在kde 应用程序中调用Scim,需要继续完成以下步骤,如果不打算使用kde 应用程序,也可以跳过。
- 在make.conf 的USE 变量中加入immqt-bc
- 执行以下命令,确保qt3 使用immqt-bc USE flag 编译,否则,接下来的步骤会出错。
# emerge -av =qt-3*
[ebuild R ] x11-libs/qt-3.3.8-r4 USE="cups gif immqt-bc* mysql opengl xinerama -debug -doc -examples -firebird -immqt -ipv6 -nas -nis -odbc -postgres -sqlite" 135 kB
- 接下来安装qt 环境中用于支持im-module 的软件包(gnome 的gtk 内建im-module 支持) 以及skim:
# emerge -av scim-qtimm skim
安装完成后,就可以在kde 应用程序中使用scim 了。
在gnome 与kde 中scim 有2套不同的配置界面与输入条,具体使用哪一个,可以在选项中的General Scim 的Other 标签页中设置,当然,也可以不去关心它。
在kde 中配置Scim,花费了我不少时间,以下几篇是我参考的Scim 官方资源:安装简介for Gentoo,更详细的安装指南for Gentoo,针对一般Linux 发布的安装指南,但也有一定的参考价值。
非必须步骤
以下步骤在安装指南 中有所提及,但经试验并非必须。
- 安装scim-tables:
$ emerge app-i18n/scim-tables
访问其它非Linux 分区
通常,移动硬盘、U盘、存储卡、MP3、Thinkpad 的第二块硬盘等移动设备,以及双启动的系统中会包含非Linux 分区,一般来说,它们会采用与Windows 兼容的FAT 分区,个别也可能是NTFS 分区。为了能在这些设备上正确显示和处理中文文件名,需要在mount 选项中指定字符集。
mount 是Linux 中一个基本的命令,可以将包括本地文件系统在内的多种文件系统映射为一个本地路径, 由于不同文件系统的特性差别,mount 针对不同的文件系统均支持一组不同的选项,这里需要用到iocharset。
对于FAT 或者NTFS 类型的分区,我们需要在mount 选项中包含:
iocharset=gb2312
迄今为止,我们还不能在这里指定其它更完整的GB字符集:gbk 与gb18030 。对于NTFS 分区,新增一个选项nls,与原有iocharset 意义相同,仅仅是为了替换它,旧的选项也保留着。nls 在其它分区类型却没有提供,因此如果喜欢使用新的选项nls 那么需要注意其仅仅针对NTFS 分区有效。
针对不同的设备,我的fstab 如下:
# 双启动Windows分区 /dev/sda3 /mnt/w vfat noauto,noatime,user,ro,codepage=936,iocharset=gb2312 0 0 # 第二块硬盘 #/dev/sdb2 /mnt/m ntfs noauto,noatime,user,iocharset=gb2312 0 0 # usb 设备 /dev/sdc1 /mnt/u1 auto noauto,noatime,user,iocharset=gb2312 0 0 /dev/sdc2 /mnt/u2 auto noauto,noatime,user,iocharset=gb2312 0 0 /dev/sdc3 /mnt/u3 auto noauto,noatime,user,iocharset=gb2312 0 0 /dev/sdc4 /mnt/u4 auto noauto,noatime,user,iocharset=gb2312 0 0 /dev/sdc5 /mnt/u5 auto noauto,noatime,user,iocharset=gb2312 0 0 # 光驱 /dev/sr0 /mnt/dvd auto noauto,noatime,user,ro,iocharset=gb2312 0 0
说明:
- 针对vfat 分区,为了安全起见,额外指定了codepage 选项,依据文档,似乎与8.3 短文件名转换有关,但我还不知道其具体会在什么情况下起作用。
- 对于usb 设备,分区类型指定auto,而不限制在vfat,以增加灵活性。
- 同样,光驱设备也没有限制为iso9660,指定了auto,原因同上。
如果不打算定义在fstab 中,只在命令行临时mount,或者为了测试,使用以下格式:
# mount -t vfat -o codepage=936,iocharset=gb2312 /dev/sda3 /mnt/w # mount -t auto -o iocharset=gb2312 /dev/sdc1 /mnt/u1
延展阅读
- Gentoo Linux Localization Guide
-
locale at wikipedia
- 关于locale的设定 Simple HOWTO
- 最精简有效的 glibc locales 设定
- Display Name of Filename in Glib
- Running GLib Applications
- Introduction to Unicode — Using Unicode in Linux
- 将 locale 从 zh_CN.GB2312 转到 zh_CN.UTF-8 的一些问题和解决方法
- Scim 安装简介for Gentoo
- 更详细的Scim 安装指南for Gentoo
- 针对一般Linux 发布的Scim 安装指南
( 未完)


