学习 Linux,302(混合环境): 国际化

非英语环境中的基本配置和命名概念

如果您在一个使用非英文字符的混合环境中工作,那么您需要理解字符代码和代码页,因为它们与您的语境 (locale) 相关。您还需要了解的是,Linux 和 Windows 环境在解释命名空间时会有所不同。尽管 Samba 支持国际化,但如果您使用较早的 Windows 客户端,则需要使用 Samba 2.x 版本,否则需要使用 Unicode 之外的特定字符集,还需要进行一些配置调优工作。根据所使用环境的语境,您可能还需要构建和修补转换库。在本文中,将学习如何处理您的 Linux 环境中的国际化。

Tracy Bost, 顾问及培训师, 自由职业

作者照片 - Tracy BostTracy Bost 是一名经验丰富的软件开发人员和系统工程师。他的专长是企业应用程序集成。他过去曾担任过抵押行业标准维护组织 (Mortgage Industry Standards Maintenance Organization, MISMO) 业务规则工作组的联合主席和 RuleML2010 行业标准的委员会联合主席。他曾在多个行业任职,这些行业包括抵押贷款、房地产和非营利行业。



2011 年 11 月 29 日

关于本系列

本系列文章帮助您了解 Linux 系统管理任务相关知识。您可以使用本系列文章的资料准备 Linux Professional Institute Certification level 3 (LPIC-3) 考试

参见我们的 学习 Linux, 302(混合环境):LPI-302 路线图,查看本系列中各篇文章的介绍和链接。路线图目前仍在更新中,目前反映的最新内容是 LPIC-3 考试的最新目标(2010 年 11 月)。在我们完成每篇文章后,都会将其添加到路线图中。

概述

在本文中,将学习以下概念:

  • 字符代码和代码页
  • 字符集如何与 Windows 客户端配合
  • 转换代码库
  • 配置 Samba 以实现国际化

本文帮助您准备 Linux Professional Institute's (LPI) Mixed Environment 特性考试 (302) 的主题 312 下的目标 312.6。该目标的权值为 1。


先决条件

关于可选的 LPI-302 考试

与其他许多认证一样,Linux Professional Institute Certification (LPIC) 提供多个不同的级别,每个级别都比前一个级别要求更多知识和经验。LPI-302 考试是 LPIC 层级的第三级中的一个可选特性考试,要求具有高级 Linux 系统管理知识。

要通过 LPIC-3 认证,您必须通过前两个一级考试(101 和 102),两个二级考试(201 和 202),以及 LPIC-3 核心考试(301)。到达这个级别后,才能参加一些可选特性考试,比如 LPI-302。

为最大限度利用本系列中的文章,您应该具备 Linux 高级知识,还应该安装一个 Linux 工作系统,以便在该系统上练习本文涉及的命令。特别是,本文假设您拥有 Linux 命令行函数方面的工作经验,并且至少对 Samba 的目的 有基本认识(请参阅文章 “学习 Linux,302(混合环境):概念”)。要执行本文描述的操作,必须安装 Samba 软件。另外,还应该安装 GNU Compiler Collection 库,并能够访问网络和 Internet。如果网络中有一个 Windows 客户端,将有助于测试非英语命名。


理解国际化

如果您处于一个混合环境中,那么您的用户可能愿意在他们自己的语境中处理文件和目录。语境 只是一组参数,定义用户的语言、国家以及用户在计算环境中可能使用和查看的其他首选项。如果软件能在用户的语境中执行,那么通常将其称为国际化(internationalization)i18n

构建您自己的提要

您可以构建一个 RSS、Atom 或 HTML 提要,以便在我们添加新文章或更新内容时收到通知。访问 developerWork RSS 提要。选择 Linux 作为专区,Articles 作为类型,输入 Linux Professional Institute 作为关键字。然后选择您想要的提要类型。

字符代码

假设您使用 Linux 中的 Nautilus 或 Windows 中的 Windows Explorer 浏览您的计算机上目录时,遇到一个名为 01100001 01110000 01110000 01101100 01101001 01100011 01100001 01110100 01101001 01101111 01101110 01110011 的目录。或者,计算机将这个目录显示为 97 112 112 108 105 99 97 116 105 111 110 11561 70 70 6C 69 63 61 74 69 6F 6E 73。除非您能够阅读二进制、十进制或十六进制,或者手边有一个转换器,否则您永远也不会知道那个目录是名为 applications 的共享目录。但是,您的计算机的确 理解这些数字。事实上,计算机只理解数字。

幸运的是,如果只是使用计算机,您不必理解二进制、十六进制、十进制或者其他任何数字 (numbering) 系统,因为转换器可以将其显示为可读的语言字符。这种转换的基础就是字符集。字符代码 是特殊字符的一种数值形式,将数值映射为一个特殊字符。表 1 展示了一个给定目录的 American Standard Code for Information Interchange (ASCII) 字符代码。

表 1. 一个名为 "applications" 的目录的 ASCII 字符代码
二进制十进制十六进制表示的字符
011000019761a
0111000011270p
0111000011270p
011011001086Cl
0110100110569i
011000119963c
011000019761a
0111010011674t
0110100110569i
011011111116Fo
011011101106En
0111001111573s

如果您的语境使用的是 ASCII,那么这个示例会很有帮助。但是,随着计算机网络的全球化,更多用户希望在他们自己的 语境内工作。

Unicode

如果您使用一个现代操作系统和软件,那么您可能已经使用了 Unicode,即使您对它不是很熟悉。如今,关于国际化的文章几乎没有不提到 Unicode 的。Unicode 是面向国际化的现代 (modern de facto) 字符代码,其目标是通过提供适用于所有已知语言的抽象字符代码来替代所有级别上的各种代码页:

  • 大多数 Linux 发行版如今默认情况下都使用 Unicode。
  • Samba 3.x 版默认情况下使用 Unicode。
  • 自从二十世纪九十年代,Windows 计算机就默认使用 Unicode (UTF-16)。

UTF-8 是最流行的 Unicode 编码方式。这种编码方式对 ASCII 字符使用单个字节,从而允许它与 ASCII 定义的字符代码具有相同的编码值。但是,为了维护前向兼容性,Linux 系统管理员需要能够理解和使用各种代码页,这很重要,因为 Unicode 可能并不总是特定非英语环境的选项或最佳解决方案。

让我们暂时回到计算机网络的早期阶段。大多数软件在有意使用英语开发的。因此,如果计算机使用来自标准 ASCII 的英语字符表示,肯定没有问题!标准 ASCII 为英语语言中的一个单字节字符分配一个数值,比如十进制格式的 0 到 127。随着需求扩展,需要包含更多字符和符号,比如法语、西班牙语和数学等式中的字符和符号,ASCII 的一个扩展被包含进来。这个扩展提供了一个额外的位,以便多包含 128 个字符,数值范围变为十进制的 128 到 255。还有一些针对标准 ASCII 的常用扩展,其中包括 ISO Latin I、Extended Binary-Coded Decimal Interchange Code(EBCDIC,IBM 使用)以及 Extended ASCII(供 Microsoft 和 DOS 操作系统使用)。

但是,如果某个特定用户环境喜欢汉语、日语、匈牙利语、斯洛文尼亚语 (Slovak) 或者另一种 ASCII 字符未能涵盖的语言,会出现什么样的情况呢?处理这些类型代码的非英语语境可以为各种代码页提供帮助。

代码页

代码页 是数字到特定字符的映射,这些字符通过一个字符集 (repertoire) 来定义,旨在可将这些字符用于某个特定语境或多个语境。代码页以前也称为码页、编码、字集、字符集经过编码的字符集。尽管在技术上,这些不同名称的意义存在细微的差别,但在本文中,术语代码页、字符集、编码方式字集 可以互换。

汉语、日语、斯洛文尼亚语和其他很多语言都有代码页。表 2 展示了一些经常使用的代码页。

表 2. 常用代码页
代码页表示
850MS-DOS Latin 1 (Western European)
437DOS-US, OEM-US
932MS-DOS Japanese Shift-JIS
852Central European languages that use Latin script
1252Windows Western European Language
950MS-DOS Traditional Chinese
65001UTF-8 (Unicode)
28591ISO-8859-1

在非英语环境中使用命名空间

由于 Samba 2.x 版不支持 Unicode,因此文件名中的所有语言字符集支持都使用了一个特殊的语境代码页。较早的 Windows 客户端使用单字节(相对于多字节)代码页。但是,Server Message Block (SMB)/Linux Common Internet File System (CIFS) 协议中没有编码转换支持。因此,当 Samba 与一个较早的 Windows 客户端通信时,您应该使用相同的字符集。

如果您的环境要求使用某个特定代码页,那么您需要了解一些 Samba 特有术语的基本含义:

  • UNIX 字符集:Linux 内部使用的字符集。
  • DOS 字符集: Samba 与较早的 Windows 客户端通信时使用的字符集。
  • 显示字符集:用于屏幕显示的字符集。

如果您的 Linux 计算机上安装了 iconv(这种可能性很大),那么您可以使用 iconv -l 命令查看可用代码页,如清单 1 所示。

清单 1. 可用代码页的部分列表
[tbost@samba ~]# iconv -l
The following list contain all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857, 860, 861, 862, 863, 864, 865,
  866, 866NAV, 869, 874, 904, 1026, 1046, 1047, 8859_1, 8859_2, 8859_3, 8859_4,
  8859_5, 8859_6, 8859_7, 8859_8, 8859_9, 10646-1:1993, 10646-1:1993/UCS4,
  ANSI_X3.4-1968, ANSI_X3.4-1986, ANSI_X3.4, ANSI_X3.110-1983, ANSI_X3.110,
  ARABIC, ARABIC7, ARMSCII-8, ASCII, ASMO-708, ASMO_449, BALTIC, BIG-5,
  BIG-FIVE, BIG5-HKSCS, BIG5, BIG5HKSCS, BIGFIVE, BRF, BS_4730, CA, CN-BIG5,
  CN-GB, CN, CP-AR, CP-GR, CP-HU, CP037, CP038, CP273, CP274, CP275, CP278,
  CP280, CP281, CP282, CP284, CP285, CP290, CP297, CP367, CP420, CP423, CP424,
  CP437, CP500, CP737, CP775, CP803, CP813, CP819, CP850, CP851, CP852, CP855,
  CP856, CP857, CP860, CP861, CP862, CP863, CP864, CP865, CP866, CP866NAV,
  CP868, CP869, CP870, CP871, CP874, CP875, CP880, CP891, CP901, CP902, CP903,
  CP904, CP905, CP912, CP915, CP916, CP918, CP920, CP921, CP922, CP930, CP932,

您可以使用 locale 命令显示计算机的当前语境。如果您需要更改您的语境,检查您的发行版的文档,确定语境文件的位置。如果您的确更改了您的郁金,那么更改后需要重启计算机才能使更改生效。清单 2 展示了一台运行 Linux 的计算机的默认语境示例。

清单 2. 一台 Linux 计算机的默认语境 (Unicode UTF-8)
[tbost@samba ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

在清单 2 中,请注意,语境被表示为易于理解的名称(相对于很多代码页命名惯例)。

使用字符集

Windows 9x 版和 Samba 2.x 使用的较早的 DOS 代码页方法支持扩展的字符集,但不支持多个组合。例如,西班牙语、英语和法语不能同时使用。如果您面临在这些环境中支持多个语境的挑战,请记住这个限制。

如果您从 Samba 2.x 升级到 Samba 3.x 或者在使用一个非英语语境后更改 Samba 的默认语境,那么您可能会发现,很多文件名称中包含特殊字符的文件现在都无法识别。通常,这些文件名将显示为一个混乱的字符序列。这通常发生在变音符号和重音符号,因为这些字符是此前使用的代码页特有的。

如果您打算使用非英语字符命名您的 Samba 服务器,那么应该确保 Samba 使用的语境与 Linux 计算机上的语境相同。这是 UNIX 字符集指令在 Samba 配置的正确设置方面发挥重要作用的地方。


使用代码转换库

iconv (libiconv) 是一个 GNU 许可程序,用于从一种编码方式转换到另一种编码方式。Samba 依赖于 Linux 计算机上安装的 iconv 并拥有必要的字符集转换例程。尽管这些转换并非总是完美无缺,但这个工具的转换效果非常好。

如果字符集中有一个错误匹配,那么很有可能导致现实了一个无法阅读的随机字符序列。但是,对于不支持的字符代码,在 Linux 或 Windows 计算机的相同代码页之间不受支持的特定字符可能会输出一个问号 (?)。在这些场景中,错误通常记录在 Samba 日志文件中,这能够为查找问题的根源提供额外的洞察。在这类情况下,您需要深入研究如何使用 Samba 服务器上的特定代码页转换字符代码。

使用复杂的多字节字符时,比如日语中的那些字符,可能需要构建 libiconv 库来支持特定代码页,或者是需要应用补丁。如果您的语境适用于日语,那么您可能需要构建 libiconv 库并应用相应的可用补丁。CP932(也称为 shift_jisWindows-31J)是用于日语的 Microsoft 代码页。libiconv 库包含一个 CP932 转换器,可用于将 Windows 代码页 932 转换为 Unicode。但是,执行正确转换需要一个补丁程序。清单 3 展示了使用这样一个库的代码示例。

清单 3. 修补、编译和安装用于 CP932 的 libiconv 库
[tbost@samba ~]# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz
[tbost@samba ~]#
 wget http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.13-cp932.patch.gz
[tbost@samba ~]# tar -xvzf libiconv-1.13.tar.gz
[tbost@samba ~]# cd libiconv-1.13
[tbost@samba ~]# gzip -dc ../libiconv-1.13-cp932.patch.gz | patch -p1
[tbost@samba libiconv-1.13]# ./configure --prefix=/usr/local/lib/libiconv
[tbost@samba libiconv-1.13]# make
[tbost@samba libiconv-1.13]# sudo make install
[tbost@samba libiconv-1.13]# /usr/local/lib/libiconv/bin/iconv  -l | egrep -i '(-31j|-ms)'
EUC-JP-MS EUCJP-MS EUCJP-WIN EUCJPMS

清单 3 中的步骤序列如下所示:

  1. 下载 libiconv 源代码。
  2. 下载适用于 CP932 的补丁。
  3. 解压缩 libiconv 源代码。
  4. 将目录更改为新创建的 libiconv-1.13 目录。
  5. 配置目录,使用 /usr/local/lib/libiconv 目录作为安装文件的位置。
  6. 编译源代码,然后使用 sudo 权限安装该工具。
  7. 验证是否已应用补丁。

转换现有文件和目录

如果已经使用一个此前使用过的字符集对目录和文件进行命名,那么,为保持命名一致性,您可能想将名称从一个字符集设置到另一个字符集。用 Perl 编写的 convmv 工具非常胜任这个将名称从一个字符集设置到另一个字符集的工作。

清单 4 中的代码下载经过压缩的 tarball,然后解压其内容。由于 convmv 是一个 Perl 脚本,因此不需要编译。最后一条命令指示 convmv 以迭代方式将 iso-8859-8 (Latin/Hebrew) 中的所有文件转换为 Unicode UTF-8。

清单 4. 使用 convmv 转换文件名称
[tbost@samba /]# wget http://www.j3e.de/linux/convmv/convmv-1.14.tar.gz
[tbost@samba /]# tar -xzvf convmv-1.14.tar.gz
[tbost@samba /]# cd convmv-1.14
[tbost@samba convmv-1.14]# sudo ./convmv -f iso-8859-8 -t utf8 
-r --notest --replace /applications

配置 Samba 以实现国际化

从 Samba 3 版开始,Unicode 就成为了默认编码方式,无需进行配置更改即可实现国际化支持(假设所有客户端都能成功使用 Unicode)。但是,如果您使用的是 Samba 2.x,或者在 Samba 在网络上拥有较早的 Windows 客户端,那么您必须调整 Samba 配置文件,指示它使用您的语境。

安装好适当的字符转换库之后,配置 Samba 以实现国际换的过程比较简单。请记住,CIFS 协议跨网络支持非英语字符集,无需进行任何更改。

启用字符集

假设您想通过配置 Samba 3 来支持西班牙语 Windows 客户端。如果您想配置一个不同的语言语境,那么应使用适当的 DOS 和 UNIX 字符集参数选项。否则,配置应该是相同的。

要启用字符集,请完成以下步骤:

  1. 作为一个最佳实践,可以创建 smb.conf 文件的一个备份。
  2. 在您钟爱的文本编辑器中打开 smb.conf。
  3. 在全局设置中添加以下指令:

      #======================= Global Settings =======================
    
    [global]
    
    dos charset = CP850
    
    unix charset = ISO8859-1

    上面的配置设置提供了在 Windows 客户端上使用代码页 850 的一个示例,而 Samba 服务器的语境设置为 IS08859-1。您的配置很有可能使用不同的代码页和语境。

  4. 测试新配置,检查语法错误或不受支持的字符集错误:

    [tbost@samba /]# testparm -v
    Load smb config files from /etc/samba/smb.conf
    rlimit_max: rlimit_max (1024) below minimum Windows limit (16384)
    Processing section "[homes]"
    Processing section "[printers]"
    Loaded services file OK.
    Server role: ROLE_STANDALONE
    Press enter to see a dump of your service definitions

    系统应该返回一条 Loaded services file OK 消息。如果出现任何关于字符集转换的警告或错误,请确保 libiconv 支持所需的字符集。

  5. 重启 Samba 或重新加载配置文件。

现在,尝试连接到一个 Windows 客户端,浏览包含重音符号或其他非英语字符的目录:

[tbost@samba /]# smbclient -U tbost  //windowsclientname/applications
Enter tbost's password:

在这里,windowslcientname 是网络中的 Windows 客户端的 NetBIOS 名称,而 applications 是 Windows 客户端上的共享目录。连接到这个共享目录后,请导航到包含非英语字符的目录列表,检查它们的显示是否正确。

参考资料

学习

获得产品和技术

讨论

  • 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux
ArticleID=777133
ArticleTitle=学习 Linux,302(混合环境): 国际化
publish-date=11292011