AIX中有关语言的环境变量比较多,本文做了明确的描述 |
本地语言支持(NLS)使用多种环境变量来影响对语言环境的选择。可以设置这些变量的值来更改语言环境信息的搜索路径。 LANG 指定安装时缺省的语言环境。 注: LANG 环境变量值是在安装时确定的。(除非设置了 LC_* 环境变量,否则每个进程都使用都使用该语言环境)。可以使用 SMIT 中的 Manage Language Environment 菜单来更改 LANG 语言环境。有关使用 SMIT 的更多信息,请参阅 AIX 5L Version 5.2 System Management Concepts: Operating System and Devices 中的 System Management Interface Tool (SMIT) Overview。C 和 POSIX 语言环境的目的就是提供最佳性能。 LC_ALL 覆盖 LANG 环境变量的值以及所有其它 LC_* 环境变量的值。 LC_COLLATE 指定用于 LC_COLLATE 类别信息的语言环境。LC_COLLATE 类别确定了字符整序和字符串整序的规则,这些规则控制着范围、同等类以及多字符整序元素的行为。 LC_CTYPE 指定用于 LC_CTYPE 类别信息的语言环境。LC_CTYPE 类别确定了字符处理的规则,这些规则控制着文本数据字符(即单字节和多字节字符)的字节序列的解释、字符的分类(如,字母、数字等)以及字符类的行为。 LC__FASTMSG 当 LC__FASTMSG 设为 true 时,该变量规定对于 C 和 POSIX 语言环境使用缺省消息,并且规定忽略 NLSPATH。否则,执行符合 POSIX 规范的消息处理。在 /etc/environment 文件中,缺省值为 LC__FASTMSG=true。 LC_MESSAGES 指定用于 LC_MESSAGES 类别信息的语言环境。LC_MESSAGES 类别确定了控制肯定性和否定性响应的规则,以及控制用于消息和菜单的语言环境(语言)的规则。 在使用不能显示多字节字符的终端时,如果希望不显示不可打印字符,可将 LC_MESSAGES 环境变量设为 C@lft。可显示多字节字符的登录会话禁用此设置。使用 cron 或 inittab 启动的进程保留 C@lft LC_MESSAGES 设置,并使用 setlocale() 子例程建立缺省消息的语言环境。如果应用程序不显示消息,请确保 LC_MESSAGES="C@lft",并通过 putenv("LC_MESSAGES=") 子例程禁用此设置。其结果就是使用经翻译的消息目录的输出。 LC_MONETARY 指定用于 LC_MONETARY 类别信息的语言环境。LC_MONETARY 类别确定了控制货币相关格式的规则。 LC_NUMERIC 指定用于 LC_NUMERIC 类别信息的语言环境。LC_NUMERIC 类别确定了控制非货币数字格式的规则。 LC_TIME 指定用于 LC_TIME 类别信息的语言环境。LC_TIME 类别确定了控制日期和时间格式的规则。 LOCPATH 指定用于本地化信息的搜索路径,包括二进制语言环境文件、输入法和代码集转换器。 注: 所有的 setuid 和 setgid 程序都忽略 LOCPATH 环境变量。 NLSPATH 指定用于查找消息目录文件的搜索路径。NLS 子系统的消息工具组件使用该环境变量。请参阅 catopen 子例程以获取更多有关 NLSPATH 变量所要求的格式的信息。 影响语言环境选择的环境变量可分为三种优先级类:高、中和低。处于高优先级类的环境变量有: LC_ALL LC_COLLATE LC_CTYPE 处于中优先级类的环境变量有: LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME 而处于低优先级类的环境变量是: LANG 当 setlocale 子例程为一个特定类别或所有类别请求语言环境时,将按以下方式,根据这些环境变量设置的优先级级别对这些设置进行查询: 如果设置了 LC_ALL 环境变量,则所有六个类别都使用该变量指定的环境变量。例如,如果 LC_ALL 环境变量等于 en_US,而 LANG 环境变量等于 fr_FR,调用 setlocale 子例程会把所有六个类别都设为 en_US 语言环境。 如果 LC_ALL 环境变量未设,则各个类别分别使用由各自对应的环境变量指定的语言环境。例如,如果 LC_ALL 环境变量未设,LC_COLLATE 环境变量设为 de_DE,而 LC_TIME 环境变量设为 fr_CA,那么调用 setlocale 子例程将把 LC_COLLATE 类别设为 de_DE,而把 LC_TIME 类别设为 fr_CA。这两个环境变量中的任一方都不会优先于另一方。 如果 LC_ALL 环境变量未设,并且某一个特定的 LC_* 环境变量的值也未设,那么 LANG 环境变量的值就决定了这一特定类别的设置。例如,如果 LC_ALL 环境变量未设,LC_CTYPE 环境变量设为 en_US,LC_NUMERIC 环境变量未设,LANG 环境变量设为 is_IS,那么调用 setlocale 子例程会将 LC_CTYPE 类别设为 en_US,而将 LC_NUMERIC 类别设为 is_IS。LANG 语言环境只为那些先前未由 LC_*? 环境变量确定的类别指定语言环境。 如果 LC_ALL 环境变量未设,某一个特定的 LC_* 环境变量的值也未设,而且 LANG 环境变量的值也同样未设置,那么该特定类别的环境变量缺省为 C 语言环境。例如,如果 LC_ALL 环境变量未设,LC_MONETARY 环境变量设为 sv_SE,LC_TIME 环境变量未设,LANG 环境变量也未设,那么调用 setlocale 子例程会将 LC_MONETARY 类别设为 sv_SE,而将 LC_TIME 类别设为 C。 环境变量优先顺序示例 下表显示这些环境变量的当前设置,以及调用 setlocale(LC_ALL,"") 的效果。最后一列指出了调用 setlocale(LC_ALL,"") 之后的语言环境设置。
环境变量和类别名
|
环境变量值 |
调用 setlocale(LC_ALL,"") 后的类别值 |
LC_COLLATE
|
de_DE |
de_DE |
LC_CTYPE |
de_DE |
de_DE |
LC_MONETARY |
en_US |
en_US |
LC_NUMERIC
|
(未设) |
da_DK |
LC_TIME
|
(未设) |
da_DK |
LC_MESSAGES
|
(未设) |
da_DK |
LC_ALL
|
(未设) |
(not applicable) |
LANG |
da_DK |
(不适用) | |
语言环境和执行速度的问题
本地语言支持(NLS)使应用不同语言环境的操作系统变得十分便利。因为广泛应用 NLS 对于从系统获取最优性能变得越来越重要,因此本附录包含了一个对于 NLS 的简短回顾。
NLS 允许操作系统定制为适合个别用户语言和文化期望。一个语言环境是语言和地理或者文化需求的特定组合,它由一个复合名称来标识,例如 en_US(美国英语)。对于每个受支持的语言环境,它们有一套消息编目、校勘值表和其它定义该语言环境的要求的信息。当安装了操作系统以后,系统管理器可选择应安装哪个语言环境。然后,各用户可以通过更改 LANG 和 LC_ALL 变量来控制每个 shell 的语言环境。
不符合上述结构的一个语言环境是 C(或 POSIX)语言环境。除非用户明确地选择另一个环境,否则 C 语言环境是系统缺省语言环境。每个新派生的进程也是再此语言环境中开始的。运行 C 语言环境最接近于操作系统在 UNIX 的原始的单语言格式中运行。没有 C 消息编目。相反,尝试从编目中获取消息的程序返回已编译进程序的默认消息。一些命令,如 sort 还原至它们原始的特定于字符集的算法。
NLS 的性能通常分为三个区域。C 语言环境对于执行命令通常是最快的,接下来是单字节(拉丁字母)语言环境,如 en_US,而多字节语言环境执行命令最慢。
编程注意事项
历史上,C 预言已经在单词字节和字符可换性使用方面显示了一定的粗陋性。这样 char foo[10] 说明的数组是一个 10 字节的数组。但不是世界上所有的语言可以用单个字节的字符来表示。例如,日语和汉语需要两个或更多的字节来确定一个要显示的特定的图形。因而,我们要区别一个 8 位数据的字节和需要用大量信息来表示单个图形的字符。
每个语言环境都有两个特征,即在该语言环境中表示字符所需的最大数量的字节以及单个字符可占据的最大数量的输出显示位置。这些值可以用 MB_CUR_MAX 和 MAX_DISP_WIDTH 宏获取。如果两个值都为 1 ,则该语言环境中依旧保留字节和字符等价。如果其中有一个值大于 1 ,则执行字符接字符进程的程序或跟踪已使用显示位置数的各程序必须使用国际化的函数来这样做。
因为每个字符的多字节编码由包含不同数量的字节构成,所以它们不可作为字符数组来处理。要在每个字符都需要深度处理的仿真环境中实现有效编码,已定义了一种固定字节宽度的数据类型 wchar_t。wchar_t 很宽,足够用来容纳任何受支持字符编码的翻译的格式。因而编程器可以声明 wchar_t 数组,并它们已在 char 数组上使用(几乎)相同的逻辑处理它们,使用传统函数 libc.a 的宽字符模拟。
遗憾的是,从在其中输入文本的多字节格式转化为(存储于磁盘或写至显示器)wchar_t 格式是在计算上是非常昂贵的。它只能在 wchar_t 格式的处理效率将高于装化为或从 wchar_t 格式转化的代价的环境中执行。
一些简单的规则
如果程序员未注意到多字节字符集设计的一些限制(这些限制允许许多程序在多字节语言环境中高效运行而几乎不用国际化函数)则可能编写出缓慢、多语言应用程序。例如:
· 在 IBM 支持的所有代码集中,字符代码 0x00 到 0x3F 是唯一的,并对 ASCII 标准字符进行编码。唯一是指这些位组合不会作为多字节字符的字节之一字节出现。因为空字符是该集的一部分,所以 strlen()、strcpy() 和 strcat() 函数用来处理多字节以及单字节字符串。程序员必须牢记 strlen() 返回的值是字符串中的字节数,而不是字符数。
· 同样地,标准字符串函数 strchr(foostr, '/') 在所有语言环境下都运行正常,因为 /(斜杠)是唯一代码点范围的一部分。实际上,大多数标准定界符在 0x00 到 0x3F 的范围内,所以大部分语法分析不用依赖国际化函数或或转化为 wchar_t 格式就能完成。
· 字符串的比较会出现两类情况:相等或不等。使用标准 strcmp() 函数来执行比较。当你写入:
if (strcmp(foostr,"a rose") == 0)
您不是在用其它任何名称查找 "a rose";您仅在查找该位集。如果 foostr 包含 "a rosE" ,则未找到任何匹配的字符。
· 当你要尝试在语言环境定义的校勘序列中排列字符串时,将发生不等比较。在那种情况下,你应使用:
if (strcoll(foostr,barstr) > 0)
并且为获取每个字符的校勘信息要付出性能代价。
· 当执行程序时,它始终 C 语言环境中开始。如果它将使用一个或多个国际化函数(包括访问消息目录)则它必须执行:
setlocale(LC_ALL, "");
以在调用任何国际化函数前切换至其父进程的语言环境。
设置语言环境
下列命令序列:
LANG=C
export LANG
设置缺省语言环境为 C(就是指如果没有明确地设置到其他变量,如 LC_COLLATE ,那么就使用 C)。
下列序列:
LC_ALL=C
export LC_ALL
无论以前的设置如何,强制设置所有语言环境变量到 C。
针对当前语言环境变量设置的报告,输入语言环境,输入 locale.
阅读(3371) | 评论(0) | 转发(0) |