C++ locale 头

  • 定义

    locale 语言环境是特定于文化的一组功能,程序可以使用这些功能在国际上移植。在C++中,语言环境由语言环境类的对象表示。 这些语言环境对象中的每一个都包含使用一组依赖于区域性的功能所需的所有信息。 但是语言环境对象本身并不直接包含功能作为成员函数:而是,语言环境对象包含有关其选择哪个构面对象的信息,并且是将这些特定构面实现为成员函数的这些构面对象中的每一个。 这允许使用相同的构面对象共享多个语言环境共有的功能,并使它们可扩展,从而允许将自定义构面添加到语言环境对象。
    方面分为六个标准类别:
    类别 方面 成员函数
    collate collate compare, hash, transform
    ctype ctype is, narrow, scan_is, scan_not, tolower, toupper, widen
    codecvt always_noconv, encoding, in, length, max_length, out, unshift
    monetary moneypunct curr_symbol, decimal_point, frac_digits, grouping, negative_sign, neg_format, positive_sign, pos_format, thousands_sep
    money_get get
    money_put put
    numeric numpunct decimal_point, falsename, grouping, thousands_sep, truename
    num_get get
    num_put put
    time time_get date_order, get_date, get_monthname, get_time, get_weekday, get_year (and get, since C++11)
    time_put put
    messages messages close, get, open
    语言环境对象可以完全由名称构造,并具有命名语言环境的所有特征,或者可以混合使用不同语言环境的构面类别(有关更多信息,请参见类locale构造函数)。因此,C++中本地化功能的核心是在不同方面实现的。 构面是对象。 这些对象由语言环境引擎自动管理,因此,通常不在程序中本地构造或复制方面对象(实际上,程序受其保护的析构函数阻止这样做)。 访问与语言环境关联的构面的特定功能的最通用方法是使用use_facet函数:
    
    // 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(或派生自它的任何类,如另一个facet)。
    • 定义一个名为id的静态成员,类型为locale::id,并带有特定的值。
    一个程序可以定义自己的facet,通过满足上述需求将其添加到地区中。 参构造函数包括所有方面作为第二个参数(称为参考),它定义了类回收是否委托给地区的引擎,因此它是自动删除当最后场所对象存在被摧毁,还是删除的项目负责。某些方面有一个等价的,但以“_byname”结尾。在构造命名的locale对象时,本地化引擎使用这些facet类型来构造适当的facet对象。所有标准facet都是使用公共成员设计的,这些公共成员调用具有相同名称的虚拟受保护成员,但前面有“do_”。操作本身的实现在于保护虚拟成员函数(派生类可以覆盖它),而非公共功能实现特定于平台的功能与操作本身,但必须允许系统上的功能正常工作。
  • C++ 98 默认情况下,所有库实现都至少为char和wchar_t类型提供所有构面,作为构面字符类型的模板参数。
    C++ 11 默认情况下,所有库实现都至少为char和wchar_t类型提供所有构面,作为构面字符类型的模板参数。 此外,还需要codecvt方面来支持char16_t和char32_t。
    类/模板 描述
    locale 区域设置类(class)
    ctype 字符类型面(类模板)
    ctype_byname 字符类型面(类模板)
    codecvt 转换代码集facet(类模板)
    codecvt_byname 转换代码集facet(类模板)
    num_get 用于解析数值的面(类模板)
    num_put 格式化数值的面(类模板)
    numpunct 数字标点facet(类模板)
    numpunct_byname 数值注释面(类模板)
    collate 用于比较和散列字符串的Facet(类模板)
    collate_byname 用于比较和散列字符串的Facet(类模板)
    time_get 用于解析日期和时间的面(类模板)
    time_get_byname 用于解析日期和时间的面(类模板)
    time_put 用于格式化日期和时间的面(类模板)
    time_put_byname 用于格式化日期和时间的面(类模板)
    money_get 用于解析货币表达式的面(类模板)
    money_put 格式化货币表达式的面(类模板)
    moneypunct 货币标点面(类模板)
    moneypunct_byname 货币标点面(类模板)
    messages 访问消息目录的面(类模板)
    messages_byname 访问消息目录的面(类模板)
    ctype_base ctype的基类(class)
    codecvt_base codecvt的基类(class)
    time_base time_get的基类(class)
    money_base Moneypunct的基类(类)
  • 函数

    函数/模板 描述
    use_facet 访问语言环境(函数模板)
    has_facet 检查语言环境是否具有构面(函数模板)
    isspace 检查字符是否为空格(函数)
    isprint 检查字符是否可打印(函数)
    iscntrl 检查字符是否为控制字符(函数)
    isupper 检查字符是否为大写字母(函数)
    islower 检查字符是否为小写字母(函数)
    isalpha 检查字符是否为字母(函数)
    isdigit 检查字符是否为十进制数字(函数)
    ispunct 检查字符是否为标点符号(函数)
    isxdigit 检查字符是否为十六进制数字(函数)
    isalnum 检查字符是否为字母数字(函数)
    isgraph 检查字符是否具有图形表示(函数)
    isblank 检查字符是否为空白(函数)