当前位置:嗨网首页>书籍在线阅读

09-地区定义

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

地区定义

和时区信息一样,地区信息同样是既浩繁且多变的。出于这一原因,与其要求各个程序和函数库来存储地区信息,还不如由系统按标准格式将地区信息存储于文件中,并加以维护。

地区信息维护于/usr/share/local(在一些发行版本中为/usr/lib/local)之下的目录层次结构中。该目录下的每个子目录都包含一特定地区的信息。这些目录的命名约定如下:

244.png language是双字母的ISO语言代码。territory是双字母的ISO国家代码。codeset表示字符编码集。modifier则提供了一种方法,用以区分多个地区目录下language、territory和codeset均相同的状况。de_DE.utf-8@euro是完整地区目录名称的例子之一,代表地区如下:德语,德国,UTF - 8字符编码,并采用欧元作为货币单位。

正如命名格式中的方括号所示,可以将地区目录名称中的相应部分省略。通常情况下,命名只包括语言和国家。因此,en_US是(说英语的)美国的地区目录,而fr_CH则是瑞士法语区的地区目录。

这里 CH 代表Confoederatio Helvetica,在拉丁语(本地中性语言,locally language-neutra)中意即“瑞士”。由于有4门官方语言,瑞士在地区上类似于跨多个时区的国家。

当在程序中指定要使用的地区时,实际上是指定了/usr /share/locale下某个子目录的名称。如果程序指定地区不与任何子目录名称相匹配,那么C语言函数库将按如下顺序将各部分从指定地区(locale)中剥离,以寻求匹配:

1. codeset

2. normalized codeset

3. territory

4. modifier

标准化字符编码集(normalized codeset)是一个特定版本字符编码集的名称,剔除了所有非字母、非数字的字符,且将所有字母转换为小写,最终字符串前冠以ISO三个字符。标准化的目的,在于排除字符集名称中因大小写和标点符号(例如,额外的连字符)而发生的变化。

这里是剥离过程的一个例子,假设为一程序指定的地区为fr_CH.utf- 8,但并不存在以该名称命名的地区目录,那么如果fr_CH目录存在,则与之匹配。如果fr_CH目录也不存在,那么将采用fr 地区目录。万一fr目录也不存在,那么简而言之,setLocale()函数将会报错。

/user/share/locale/locale.alias 文件定义了为程序设定地区的替代方法。详见locale.aliases(5)手册页。

每个地区子目录中包括有标准的一套文件,指定了此地区的约定设置,如表10-2所示。关于本表中的信息,还要注意以下几点。

  • 文件LC_COLLATE定义了一套规则,描述了如何在一字符集内对字符排序(例如alphabetical“按字母顺序排列的”字符集顺序)。这些规则将决定函数strcoll(3)和strxfrm(3)的动作。即便是同属拉丁语系的语言,其遵循的排序规则也不相同。例如,一些欧洲语言有额外字母,在某些情况下排在字母Z之后。另外还有特殊情况,西班牙语的双字母序列ll,排序时位于字母l之后。又比如德语的元音变音字符ä,对应于ae,并与该双字母排在相同位置。
  • 目录LC_MESSAGES是程序显示信息迈向国际化的步骤之一。要实现更为全面的程序信息国际化,可以采用消息目录(参考 catopen(3)和 catgets(3)手册页)或是GNU的gettext API(参见http://www.gnu.org/)。

Glibc的2.2.2版引入了一系列非标准的地区新类别。LC_ADDRESS定义了特定于地区的邮政地址表示规则。LC_IDENTIFICATION指定了识别地区的信息。LC_MEASUREMENT定义了地区的度量系统(例如,公制/英制)。LC_NAME定义了特定于地区的人名及头衔表示规则。LC_PAPER定义了该地区的标准纸张尺寸(例如,美国信纸/其他大多数国家所使用的A4纸)。LC_TELEPHONE则定义了特定于地区的国内及国际电话号码表示规则,以及国际长途国家代码和国际拨号前缀。

表10-2:特定于地区的子目录内容

| 文 件 名 | 目  的 | | :----- | :----- | :----- | :----- | | LC_CTYPE | 该文件包含字符分类(参见isalpha(3)手册页)以及大小写转换规则 | | LC_COLLATE | 该文件包含针对一字符集的排序规则 | | LC_MONETARY | 该文件包含对币值的格式化规则(见localeconv(3)和<locale.h>) | | LC_NUMERIC | 该文件包含对币值以外数字的格式化规则(见localeconv(3)和<locale.h>) | | LC_TIME | 该文件包含对日期和时间的格式化规则 | | LC_MESSAGES | 该目录下所含文件,针对肯定和否定(是/否)响应,就格式及数值做了规定 |

系统中实际定义的地区可能会各有不同。除了必须定义一个名为POSIX(与C同义,后者的存在是由于历史原因)的标准地区外,SUSv3没有对此作出任何要求。POSIX折射出UNIX系统的历史渊源。因之,系统建立于ASCII字符集之上,使用英文来描述日期,并以“yes/no”来响应。该地区的货币和数字格式则处于未定义状态。

locale命令显示当前地区环境(本shell内)的相关信息。命令locale – a则将列出系统上定义的整套地区。