在本文中,将学习以下概念:
- 字符代码和代码页
- 字符集如何与 Windows 客户端配合
- 转换代码库
- 配置 Samba 以实现国际化
本文帮助您准备 Linux Professional Institute's (LPI) Mixed Environment 特性考试 (302) 的主题 312 下的目标 312.6。该目标的权值为 1。
为最大限度利用本系列中的文章,您应该具备 Linux 高级知识,还应该安装一个 Linux 工作系统,以便在该系统上练习本文涉及的命令。特别是,本文假设您拥有 Linux 命令行函数方面的工作经验,并且至少对 Samba 的目的 有基本认识(请参阅文章 “学习 Linux,302(混合环境):概念”)。要执行本文描述的操作,必须安装 Samba 软件。另外,还应该安装 GNU Compiler Collection 库,并能够访问网络和 Internet。如果网络中有一个 Windows 客户端,将有助于测试非英语命名。
如果您处于一个混合环境中,那么您的用户可能愿意在他们自己的语境中处理文件和目录。语境 只是一组参数,定义用户的语言、国家以及用户在计算环境中可能使用和查看的其他首选项。如果软件能在用户的语境中执行,那么通常将其称为国际化(internationalization) 或 i18n。
假设您使用 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 115 或 61 70 70 6C 69 63 61 74 69 6F 6E 73。除非您能够阅读二进制、十进制或十六进制,或者手边有一个转换器,否则您永远也不会知道那个目录是名为 applications 的共享目录。但是,您的计算机的确 理解这些数字。事实上,计算机只理解数字。
幸运的是,如果只是使用计算机,您不必理解二进制、十六进制、十进制或者其他任何数字 (numbering) 系统,因为转换器可以将其显示为可读的语言字符。这种转换的基础就是字符集。字符代码 是特殊字符的一种数值形式,将数值映射为一个特殊字符。表 1 展示了一个给定目录的 American Standard Code for Information Interchange (ASCII) 字符代码。
表 1. 一个名为 "applications" 的目录的 ASCII 字符代码
| 二进制 | 十进制 | 十六进制 | 表示的字符 |
|---|---|---|---|
| 01100001 | 97 | 61 | a |
| 01110000 | 112 | 70 | p |
| 01110000 | 112 | 70 | p |
| 01101100 | 108 | 6C | l |
| 01101001 | 105 | 69 | i |
| 01100011 | 99 | 63 | c |
| 01100001 | 97 | 61 | a |
| 01110100 | 116 | 74 | t |
| 01101001 | 105 | 69 | i |
| 01101111 | 111 | 6F | o |
| 01101110 | 110 | 6E | n |
| 01110011 | 115 | 73 | s |
如果您的语境使用的是 ASCII,那么这个示例会很有帮助。但是,随着计算机网络的全球化,更多用户希望在他们自己的 语境内工作。
让我们暂时回到计算机网络的早期阶段。大多数软件在有意使用英语开发的。因此,如果计算机使用来自标准 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. 常用代码页
| 代码页 | 表示 |
|---|---|
| 850 | MS-DOS Latin 1 (Western European) |
| 437 | DOS-US, OEM-US |
| 932 | MS-DOS Japanese Shift-JIS |
| 852 | Central European languages that use Latin script |
| 1252 | Windows Western European Language |
| 950 | MS-DOS Traditional Chinese |
| 65001 | UTF-8 (Unicode) |
| 28591 | ISO-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_jis 和 Windows-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 中的步骤序列如下所示:
- 下载
libiconv源代码。 - 下载适用于 CP932 的补丁。
- 解压缩
libiconv源代码。 - 将目录更改为新创建的 libiconv-1.13 目录。
- 配置目录,使用 /usr/local/lib/libiconv 目录作为安装文件的位置。
- 编译源代码,然后使用 sudo 权限安装该工具。
- 验证是否已应用补丁。
如果已经使用一个此前使用过的字符集对目录和文件进行命名,那么,为保持命名一致性,您可能想将名称从一个字符集设置到另一个字符集。用 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 3 版开始,Unicode 就成为了默认编码方式,无需进行配置更改即可实现国际化支持(假设所有客户端都能成功使用 Unicode)。但是,如果您使用的是 Samba 2.x,或者在 Samba 在网络上拥有较早的 Windows 客户端,那么您必须调整 Samba 配置文件,指示它使用您的语境。
安装好适当的字符转换库之后,配置 Samba 以实现国际换的过程比较简单。请记住,CIFS 协议跨网络支持非英语字符集,无需进行任何更改。
假设您想通过配置 Samba 3 来支持西班牙语 Windows 客户端。如果您想配置一个不同的语言语境,那么应使用适当的 DOS 和 UNIX 字符集参数选项。否则,配置应该是相同的。
要启用字符集,请完成以下步骤:
- 作为一个最佳实践,可以创建 smb.conf 文件的一个备份。
- 在您钟爱的文本编辑器中打开 smb.conf。
- 在全局设置中添加以下指令:
#======================= Global Settings ======================= [global] dos charset = CP850 unix charset = ISO8859-1
上面的配置设置提供了在 Windows 客户端上使用代码页 850 的一个示例,而 Samba 服务器的语境设置为 IS08859-1。您的配置很有可能使用不同的代码页和语境。
- 测试新配置,检查语法错误或不受支持的字符集错误:
[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支持所需的字符集。 - 重启 Samba 或重新加载配置文件。
现在,尝试连接到一个 Windows 客户端,浏览包含重音符号或其他非英语字符的目录:
[tbost@samba /]# smbclient -U tbost //windowsclientname/applications Enter tbost's password: |
在这里,windowslcientname 是网络中的 Windows 客户端的 NetBIOS 名称,而 applications 是 Windows 客户端上的共享目录。连接到这个共享目录后,请导航到包含非英语字符的目录列表,检查它们的显示是否正确。
学习
-
查看 IBM
代码页标识符 列表,详细了解 IBM 如何归类各种语言的代码页。
-
查看 Microsoft
代码页标识符 列表,详细了解针对各种语言的可用 Windows 代码页。
-
Samba 手册 第 30 章 讨论了 Samba 3.x 的 Unicode 支持和如何修补
iconv实现日语支持。 -
参阅 Samba 手册,了解 如何实现 SWAT 国际化支持,以及如何使用 SWAT 管理非英语环境。
-
了解 GNU
libiconv以及它如何转换字符集。 -
在 LPIC Program 站点查找 LPI 的 Linux 系统管理认证的三个级别的详细目标、任务列表和样例问题。特别是要查看 LPI-302
详细目标 和 任务和样例问题。
- 复习 developerWorks 上的整个 LPI 考试备考系列,学习 Linux 基础知识,根据 2009 年 4 月以前的 LPI 考试目标准备系统管理员认证考试。
-
针对修改后的 LPIC 考试的备考资源 提供由 LPI 维护的一个其他认证培训资源列表。
- 观看 developerWorks 演示中心,包括面向初学者的产品安装和设置演示,以及为经验丰富的开发人员提供的高级功能。
- 在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
- 在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。
- 随时关注 developerWorks 技术活动和网络广播。
获得产品和技术
-
stunnel网站 提供关于这个程序的下载和文档。 -
OpenSSL 网站 提供关于这个软件的下载和文档。
讨论
- 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
