13.0 概述
本章将描述有关C++程序国际化时的几个共同问题的解决方案。使得程序能够在不同的环境中可以工作(常常称为本地化)常常需要解决两个问题:以遵循当地传统的方式格式化用户可见的字符串(如日期、时间、钱和数字),并且使得数字在不同的字符集中一致。这一章我们主要处理第一个问题,对第二个问题只做概要性的介绍,因为在不同的字符集上还很少有标准可以支持,大部分都是依赖于实现的。
大部分程序都需要在很多国家而不是只局限在实现这个程序的国家运行。为了支持这个现实,为使得实现的代码可以在不同的国家运行,C++类库提供了几个工具。然而,这几个工具的设计不同于其他的标准类库工具,如字符串、文件输入和输出、容器、算法等等。例如,用来代表一个本地环境的类是locale,它在头文件<locale>中提供。这个locale类为使用本地特殊的格式从流中读或向流中写提供了一些方便之处,当然也为获取一个本地环境的信息如货币符号或者日期格式提供了一些方便的方法。这个标准仅需要提供一个简单的locale,并且这个简单的locale可以是“C”或传统的locale。这个传统的locale使用ANSI C惯例:美国英语惯例和7位的ASCII字符编码。对于各种语言和地区是否需要提供locale实例则由实现自己来决定。
这个<locale>头文件有三个基本的部分。首先,这有一个locale类。它封装了C++支持的这个locale类行为的各个方面,并且这也是你需要做一些与某个locale相关的格式时的入口点。第二,一个locale的最小粒度部分和你与之工作的具体类是facet。一个facet的例子是一个类,如给一个流写入日期的time_put类。第三,每个facet都属于某个类型,它是用来把相关的facet组织起来的方法。这些类型的例子是数字、时间和货币(前面我提到的time_put facet就属于时间类型)。本章我主要讨论这些类型,但是这些类型仅当你在某个locale上作一些复杂的处理时才真的方便,因此我不会进一步讨论它们。
每一个C++程序至少有一个locale,这个locale是当成全局locale的(它经常是作为一个全局的静态对象实现的)。默认的情况下,它是传统的“C”locale,除非你把它改变成别的locale了。locale的其中一个构造函数可以让你初始化用户需要的locale,尽管你可以很自由地精确定义什么是用户需要的locale。
在大部分情况下,当从流中读或写时,你仅需要使用locale类。这是本章的焦点。






