下一页 上一页 目录

3. 本地环境设置

3.1 文件和内核

现在你已经可以在文件名中使用任何 Unicode 字符了。内核或文件实用程序无需任何修改。这是因为内核中的文件名可以是任何不包含空字节的内容,而 '/' 用于分隔子目录。当使用 UTF-8 编码时,非 ASCII 字符永远不会使用空字节或斜杠进行编码。所有发生的事情是,文件和目录名占用的字节比它们包含的字符更多。例如,一个由五个希腊字符组成的文件名在内核中将显示为 10 字节的文件名。内核不知道(也不需要知道)这些字节显示为希腊字符。

这是通用理论,只要你的文件保留在 Linux 内部。对于来自其他操作系统的文件系统,你可以使用挂载选项来控制文件名与 UTF-8 之间的转换

其他文件系统(nfs、smbfs、ncpfs、hpfs 等)不转换文件名;因此,只有当其他操作系统支持 UTF-8 编码的 Unicode 文件名时,它们才支持。请记住,要为所有未来的重新挂载启用挂载选项,你需要将其添加到相应的 /etc/fstab 行的第四列。

3.2 升级 C 库

glibc-2.2 支持多字节本地环境,特别是 UTF-8 本地环境。但是 glibc-2.1.x 和更早版本的 C 库不支持它。因此,你需要升级到 glibc-2.2。从 glibc-2.1.x 升级是无风险的,因为 glibc-2.2 与 glibc-2.1.x 二进制兼容(至少在 i386 平台上,除了 IPv6)。尽管如此,我建议准备一个可启动的救援磁盘,以防出现问题。

准备内核源代码。你必须解压并配置它们。/usr/src/linux/include/linux/autoconf.h 必须存在。不需要构建内核。

检索 glibc 源代码 ftp://ftp.gnu.org/pub/gnu/glibc/,su 到 root,然后解压、构建并安装它

# unset LD_PRELOAD
# unset LD_LIBRARY_PATH
# tar xvfz glibc-2.2.tar.gz
# tar xvfz glibc-linuxthreads-2.2.tar.gz -C glibc-2.2
# mkdir glibc-2.2-build
# cd glibc-2.2-build
# ../glibc-2.2/configure --prefix=/usr --with-headers=/usr/src/linux/include --enable-add-ons
# make
# make check
# make info
# LC_ALL=C make install
# make localedata/install-locales

无法通过这种方式从早于 2.1.x 的 glibc 版本升级;考虑首先安装一个基于 glibc-2.1.x 的 Linux 发行版,然后如上所述升级到 glibc-2.2。

请注意,如果 -- 由于任何原因 -- 你想在安装 glibc-2.2 后重建 GCC,你需要首先将此补丁 gcc-glibc-2.2-compat.diff 应用于 GCC 源代码。

3.3 通用数据转换

你需要一个程序来将你的本地(可能是 ISO-8859-1)编码的文本转换为 UTF-8。(另一种选择是在同一台机器上继续使用不同编码的文本;从长远来看这并不好玩。)其中一个程序是 `iconv',它随 glibc-2.2 一起提供。只需使用

$ iconv --from-code=ISO-8859-1 --to-code=UTF-8 < old_file > new_file

这里有两个方便的 shell 脚本,分别称为 "i2u" i2u.sh(用于 ISO 到 UTF 转换)和 "u2i" u2i.sh(用于 UTF 到 ISO 转换)。根据你当前的 8 位字符集进行调整。

如果你没有安装 glibc-2.2 和 iconv,你可以使用 GNU recode 3.6 代替。"i2u" i2u_recode.sh 是 "recode ISO-8859-1..UTF-8",而 "u2i" u2i_recode.sh 是 "recode UTF-8..ISO-8859-1"。 ftp://ftp.gnu.org/pub/gnu/recode/recode-3.6.tar.gz

或者你也可以使用 CLISP 代替。这里有 "i2u" i2u.lisp 和 "u2i" u2i.lisp 用 Lisp 编写的脚本。注意:你需要 1999 年 7 月或更新版本的 CLISP。 ftp://clisp.cons.org/pub/lisp/clisp/source/clispsrc.tar.gz

其他数据转换程序,功能不如 GNU recode 强大,包括 `trans' ftp://ftp.informatik.uni-erlangen.de/pub/doc/ISO/charsets/trans113.tar.gz、来自 Plan9 操作系统的 `tcs' ftp://ftp.informatik.uni-erlangen.de/pub/doc/ISO/charsets/tcs.tar.gz,以及 G. Adam Stanislav 的 `utrans'/`uhtrans'/`hutrans' ftp://ftp.cdrom.com/pub/FreeBSD/distfiles/i18ntools-1.0.tar.gz <adam@whizkidtech.net>

对于将文件从不同字符集重复转换为 UTF-8,可以使用半自动工具:to-utf8 向用户显示文件的非 ASCII 部分,让他决定文件的原始字符集,然后将文件转换为 UTF-8。

3.4 本地环境环境变量

你可能设置了以下环境变量,其中包含本地环境名称

LANGUAGE

LC_MESSAGES 的覆盖,仅由 GNU gettext 使用

LC_ALL

所有其他 LC_* 变量的覆盖

LC_CTYPE, LC_MESSAGES, LC_COLLATE, LC_NUMERIC, LC_MONETARY, LC_TIME

各个变量分别用于:字符类型和编码、自然语言消息、排序规则、数字格式、货币金额格式、日期和时间显示

LANG

所有 LC_* 变量的默认值

(有关详细说明,请参阅 `man 7 locale'。)

每个 LC_* 和 LANG 变量都可以包含以下形式的本地环境名称

language[_territory[.codeset]][@modifier]

其中 language 是 ISO 639 语言代码(小写),territory 是 ISO 3166 国家代码(大写),codeset 表示字符集,modifier 代表其他特定属性(例如指示特定的语言方言或非标准正字法)。

LANGUAGE 可以包含多个本地环境名称,以冒号分隔。

为了告知你的系统和所有应用程序你正在使用 UTF-8,你需要将 UTF-8 的 codeset 后缀添加到你的本地环境名称中。例如,如果你正在使用

LC_CTYPE=de_DE
你将把它更改为
LC_CTYPE=de_DE.UTF-8

需要更改你的 LANGUAGE 环境变量。glibc-2.2 中的 GNU gettext 具有将翻译转换为正确编码的能力。

3.5 创建本地环境支持文件

你使用 localedef 为你打算使用的每个 UTF-8 本地环境创建支持文件,例如

$ localedef -v -c -i de_DE -f UTF-8 de_DE.UTF-8

你通常不需要创建名为 "de" 或 "fr" 且没有国家后缀的本地环境,因为这些本地环境通常仅由 LANGUAGE 变量使用,而不是由 LC_* 变量使用,并且 LANGUAGE 仅用作 LC_MESSAGES 的覆盖。


下一页 上一页 目录