头文件

<locale>

本地化库
本地化环境(locale)是一组特定于文化的特性,程序可以使用这些特性使其在国际上更具可移植性。

在 C++ 中,本地化环境由 locale 类的对象表示。每个 locale 对象都包含使用一组依赖于文化的特性所需的所有信息。但 locale 对象并不直接将这些特性作为成员函数包含在内:相反,locale 对象包含有关其选择哪些刻面(facet)对象的信息,而正是这些刻面对象将特定特性实现为成员函数。这使得多个本地化环境可以通过使用相同的刻面对象来共享通用特性,并使其具有可扩展性,允许将自定义刻面添加到 locale 对象中。

刻面分为六个标准类别

类别刻面成员函数
collatecollatecomparehashtransform
ctypectypeisnarrowscan_isscan_nottolowertoupperwiden
codecvtalways_noconvencodinginlengthmax_lengthoutunshift
货币moneypunctcurr_symboldecimal_pointfrac_digitsgroupingnegative_signneg_formatpositive_signpos_formatthousands_sep
money_getget
money_putput
数值numpunctdecimal_pointfalsenamegroupingthousands_septruename
num_getget
num_putput
时间time_getdate_orderget_dateget_monthnameget_timeget_weekdayget_year(以及自 C++11 起的 get
time_putput
messagesmessagesclosegetopen

Locale 对象可以完全通过一个名称来构造,从而获得该指定本地化环境的所有特性,也可以混合不同本地化环境的刻面类别(更多信息请参见类 locale 构造函数)。

因此,C++ 中本地化功能的核心是在不同的刻面中实现的。刻面是对象。这些对象由本地化引擎自动管理,因此刻面对象通常不会在程序中局部构造或复制(实际上,它们的受保护析构函数会阻止程序这样做)。访问与某个本地化环境关联的刻面的特定特性的最通用方法是使用函数 use_facet

1
2
3
4
5
6
// using facet member directly:
myvar = use_facet < numpunct<char> > (mylocale).decimal_point();

// alias facet:
const numpunct<char>& myfacet = use_facet < numpunct<char> > (mylocale);
myvar = myfacet.decimal_point();

每个刻面
  • 都派生自类 locale::facet(或从其派生的任何类,如另一个刻面)。
  • 定义一个名为 id 的静态成员,类型为 locale::id,具有特定值。
程序可以通过满足上述要求来定义自己的刻面并添加到本地化环境中。

所有刻面构造函数的第二个参数(在本参考中称为 refs)定义了类的内存释放是否委托给本地化引擎,因此当包含它的最后一个 locale 对象被销毁时,它会自动被删除,还是由程序在某个时刻负责删除它。

一些刻面有一个以 "_byname" 结尾的等价物。当构造一个命名的 locale 对象时,本地化引擎会使用这些刻面类型来构造适当的刻面对象。

所有标准刻面的设计都是通过公共成员调用同名但以 "do_" 开头的虚保护成员。操作本身的实现位于虚保护成员函数中(以便派生类可以轻松覆盖它),而非虚公共函数则可以实现与操作本身无关但对于使该功能在系统上正常工作所必需的平台特定功能。

所有库实现至少默认提供所有刻面,其中 charwchar_t 类型作为刻面字符类型的模板参数。
所有库实现至少默认提供所有刻面,其中 charwchar_t 类型作为刻面字符类型的模板参数。此外,codecvt 刻面还需要支持 char16_tchar32_t

函数

刻面管理:

便捷接口cctype 函数的模板版本)


标准刻面:

标准刻面的基类(定义成员类型):