如果是初次安装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种

  1. 一般性中文要求,仅要求系统具有中文的处理能力。
    要求操作系统以及应用程序能够正确显示并处理中文字符,包括文件名、文本文件内容等,并且可以输入中文。
  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

说明:

  1. 针对vfat 分区,为了安全起见,额外指定了codepage 选项,依据文档,似乎与8.3 短文件名转换有关,但我还不知道其具体会在什么情况下起作用。
  2. 对于usb 设备,分区类型指定auto,而不限制在vfat,以增加灵活性。
  3. 同样,光驱设备也没有限制为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 

延展阅读

( 未完)

Post a comment

mail.png


相似文章|Related Entries

最近更新|Recent Entries

不定期更新|Handy Entries

相似标签|Related Tags

chinese
font (1)
gentoo (16)
Gentoo (1)
linux (18)
locale (1)
t43 (11)
thinkpad (11)
中文 (1)
gentoo
3d (1)
chinese (2)
conf (1)
db2 (2)
driver (2)
emerge (0)
environment (1)
fingerprint reader (1)
Fn (0)
fonts (1)
hdaps (1)
java (1)
jdk (1)
kernel configuration (1)
linux (18)
locale (1)
picasa (1)
portage (0)
ramdisk (2)
rebuildpkgdb (1)
software (2)
soundcard (0)
subversion (2)
svn (1)
t43 (11)
thinkpad (11)
tmpfs (1)
wine (1)
wireless (1)
x300 (1)
中文 (1)
指纹 (1)
linux
3d (1)
chinese (2)
conf (1)
db2 (2)
driver (2)
emerge (0)
environment (1)
fingerprint reader (1)
Fn (0)
font (1)
fonts (1)
gentoo (16)
Gentoo (1)
hdaps (1)
java (1)
jdk (1)
kernel configuration (1)
locale (1)
picasa (1)
portage (0)
ramdisk (2)
rebuildpkgdb (1)
software (2)
soundcard (0)
subversion (2)
svn (1)
t43 (11)
thinkpad (11)
tmpfs (1)
wine (1)
winxp (4)
wireless (1)
x300 (1)
中文 (1)
指纹 (1)
locale
chinese (2)
gentoo (16)
linux (18)
t43 (11)
thinkpad (11)
中文 (1)
t43
3d (1)
chinese (2)
conf (1)
driver (2)
environment (1)
fingerprint reader (1)
Fn (0)
font (1)
gentoo (16)
Gentoo (1)
hdaps (1)
kernel configuration (1)
linux (18)
locale (1)
soundcard (0)
thinkpad (11)
wireless (1)
x300 (1)
中文 (1)
指纹 (1)
thinkpad
3d (1)
chinese (2)
conf (1)
driver (2)
environment (1)
fingerprint reader (1)
Fn (0)
font (1)
gentoo (16)
Gentoo (1)
hdaps (1)
kernel configuration (1)
linux (18)
locale (1)
soundcard (0)
t43 (11)
wireless (1)
x300 (1)
中文 (1)
指纹 (1)
中文
chinese (2)
gentoo (16)
linux (18)
locale (1)
t43 (11)
thinkpad (11)

分类栏目|Categories

按月归档|By Month

2008
03
02
01
2007
12
10
07
06
05
04
03
02
01
2006
12
11
10
09
08
07
06
05
04
03
02
01
2005
11
10
09
08
07
04
03
2004
12
11
10
09
08
07
06
05
04
03
02
01
2003
12
10
09
08
06
2002
09
08
04
03
02
2001
12
09
07
06
05

站内链接|Site Links

Powered by
Movable Type 3.34