Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1492271
  • 博文数量: 263
  • 博客积分: 10851
  • 博客等级: 上将
  • 技术积分: 2627
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-26 22:40
文章分类

全部博文(263)

文章存档

2013年(4)

2012年(25)

2011年(33)

2010年(50)

2009年(138)

2008年(13)

分类: LINUX

2009-10-23 19:00:23

本地语言支持(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 . 

阅读(564) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~