现在你已经可以在文件名中使用任何 Unicode 字符了。内核或文件实用程序无需任何修改。这是因为内核中的文件名可以是任何不包含空字节的内容,而 '/' 用于分隔子目录。当使用 UTF-8 编码时,非 ASCII 字符永远不会使用空字节或斜杠进行编码。所有发生的事情是,文件和目录名占用的字节比它们包含的字符更多。例如,一个由五个希腊字符组成的文件名在内核中将显示为 10 字节的文件名。内核不知道(也不需要知道)这些字节显示为希腊字符。
这是通用理论,只要你的文件保留在 Linux 内部。对于来自其他操作系统的文件系统,你可以使用挂载选项来控制文件名与 UTF-8 之间的转换
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 源代码。
你需要一个程序来将你的本地(可能是 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。
你可能设置了以下环境变量,其中包含本地环境名称
LC_MESSAGES 的覆盖,仅由 GNU gettext 使用
所有其他 LC_* 变量的覆盖
各个变量分别用于:字符类型和编码、自然语言消息、排序规则、数字格式、货币金额格式、日期和时间显示
所有 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 具有将翻译转换为正确编码的能力。
你使用 localedef
为你打算使用的每个 UTF-8 本地环境创建支持文件,例如
$ localedef -v -c -i de_DE -f UTF-8 de_DE.UTF-8
你通常不需要创建名为 "de" 或 "fr" 且没有国家后缀的本地环境,因为这些本地环境通常仅由 LANGUAGE 变量使用,而不是由 LC_* 变量使用,并且 LANGUAGE 仅用作 LC_MESSAGES 的覆盖。