std::locale

来自cppreference.com
< cpp‎ | locale
 
 
本地化库
本地环境与平面
本地环境
locale
平面类别基类
ctype(字符类别)平面
numeric(数值)平面
collate(对照比较)平面
time(时间)平面
monetary(货币)平面
messages(消息)平面
字符分类与转换
字符分类
转换
编码转换平面
(C++11)    
C 本地环境
 
 
在标头 <locale> 定义
class locale;

std::locale 类型对象(本地环境对象)是不可变平面的不可变索引集。C++ 输入/输出库的每个流对象都与一个 std::locale 对象关联,并用它的平面分析及格式化所有数据。另外,每个 std::basic_regex 对象也都与一个本地环境对象关联。 (C++11 起)本地环境对象也可以在标准容器和算法中用作进行字符串对照的谓词,而且能被直接访问,以获得或修改它所保有的平面。

C++ 程序中构造的每个本地环境至少保有下列标准平面(也就是说 std::has_facet 会对这些平面类型返回 true),但程序可以定义额外特化,或全新的平面,并将它们添加到任何既存的本地环境对象。

受支持平面
std::collate<char>
std::collate<wchar_t>
std::codecvt<char, char, std::mbstate_t>
std::codecvt<wchar_t, char, std::mbstate_t>
std::codecvt<char16_t, char8_t, std::mbstate_t> (C++20 起)
std::codecvt<char32_t, char8_t, std::mbstate_t> (C++20 起)
std::ctype<char>
std::ctype<wchar_t>
std::money_get<char>
std::money_get<wchar_t>
std::moneypunct<char>
std::moneypunct<char, true>
std::moneypunct<wchar_t>
std::moneypunct<wchar_t, true>
std::money_put<char>
std::money_put<wchar_t>
std::num_get<char>
std::num_get<wchar_t>
std::numpunct<char>
std::numpunct<wchar_t>
std::num_put<char>
std::num_put<wchar_t>
std::time_get<char>
std::time_get<wchar_t>
std::messages<char>
std::messages<wchar_t>
std::time_put<char>
std::time_put<wchar_t>
被弃用平面
std::codecvt<char16_t, char, std::mbstate_t> (C++11 起)(C++20 中弃用)
std::codecvt<char32_t, char, std::mbstate_t> (C++11 起)(C++20 中弃用)

在内部,本地环境对象实现为如同它是一个指向(以 std::locale::id 索引的)的数组的引用计数指针,数组元素为指向平面的引用计数指针:复制本地环境只会复制一个指针,并增加几个引用计数。为维护标准 C++ 库线程安全保证(不同对象上的操作始终为线程安全),本地环境引用计数和每个平面的引用计数都以线程安全方式更新,类似 std::shared_ptr

成员类型

平面索引类型:每个平面类必须声明或继承此类型的公开静态成员
(类)
所有平面类别的基类:任何类别的每个平面都会从此类型派生
(类)
category
int
(typedef)

成员对象

none
[静态]
指示无平面类别的 category 类型零值
(公开静态成员常量)
collate
[静态]
category 类型位掩码值
(公开静态成员常量)
ctype
[静态]
category 类型位掩码值
(公开静态成员常量)
monetary
[静态]
category 类型位掩码值
(公开静态成员常量)
numeric
[静态]
category 类型位掩码值
(公开静态成员常量)
time
[静态]
category 类型位掩码值
(公开静态成员常量)
messages
[静态]
category 类型位掩码值
(公开静态成员常量)
all
[静态]
collate | ctype | monetary | numeric | time | messages
(公开静态成员常量)

对于 std::locale 的要求有类型 category 的实参的成员函数,该实参必须是以上列出的 category 值之一,或它们之中两者或多者的并集。不接受 LC 常量

成员函数

构造新的 locale
(公开成员函数)
析构 locale 和其引用计数变为零的平面
(公开成员函数)
替换 locale
(公开成员函数)
以复制自另一 locale 的编译时鉴别的平面构造 locale
(公开成员函数)
返回 locale 的名称,或若它无名则为 "*"
(公开成员函数)
(C++20 中移除)
locale 对象之间的相等性比较
(公开成员函数)
用此 locale 的 collate 刻面以字典序比较两个字符串
(公开成员函数)
[静态]
更改全局本地环境
(公开静态成员函数)
[静态]
获得到 "C" 本地环境的引用
(公开静态成员函数)

示例

演示本地环境影响的程序(跨平台)的典型前文

#include <iostream>
#include <locale>
 
int main()
{
    // 以用户偏好的本地环境替换 C++ 本地环境和 C 本地环境
    std::locale::global(std::locale(""));
 
    std::wcout << L"用户偏好的本地环境设置是 " << std::locale("").name().c_str() << '\n';
    // 在启动时,全局本地环境是 "C" 本地环境
    std::wcout << 1000.01 << '\n';
 
 
    // 将来的宽字符输出会使用新的全局本地环境
    std::wcout.imbue(std::locale());
 
    // 再次输出同一数字
    std::wcout << 1000.01 << '\n';
}

可能的输出:

用户偏好的本地环境设置是 en_US.UTF8
1000.01
1,000.01

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 340 C++98 所有本地环境都要保有的标准平面集合不明确 使之明确
LWG 347 C++98 category 类型的形参可以接受 LC 常量 不再接受

参阅

从本地环境获得一个平面
(函数模板)
检查本地环境是否实现特定的平面
(函数模板)
设置本地环境
(std::ios_base 的公开成员函数)
返回当前本地环境
(std::ios_base 的公开成员函数)