std::locale
来自cppreference.com
在标头 <locale> 定义
|
||
class locale; |
||
std::locale
类型的对象(本地环境对象)是不可变刻面的一个不可变索引集。C++ 输入/输出库的每个流对象都与一个 std::locale
对象关联,并用它的各刻面来分析及格式化所有数据。另外,每个 std::basic_regex 对象也都与一个本地环境对象关联。 (C++11 起)本地环境对象也可以在标准容器和算法中用作进行字符串校排的谓词,而且也可以直接访问,以获得或修改它所保有的平面。
C++ 程序中构造的每个本地环境至少保有下列标准刻面(也就是说 std::has_facet 会对这些刻面类型返回 true),但程序可以定义额外特化,或全新的刻面,并将它们添加到任何既存的本地环境对象。
受支持刻面 | |
---|---|
std::ctype<char> std::ctype<wchar_t> |
std::codecvt<char, char, std::mbstate_t> std::codecvt<wchar_t, char, std::mbstate_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::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::time_get<char> std::time_get<wchar_t> |
std::collate<char> std::collate<wchar_t> |
std::time_put<char> std::time_put<wchar_t> |
std::messages<char> std::messages<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::codecvt<char16_t, char8_t, std::mbstate_t> (C++20 起)(弃用) std::codecvt<char32_t, char8_t, std::mbstate_t> (C++20 起)(弃用) |
在内部,本地环境对象实现为如同它是一个指向(以 std::locale::id 索引的)的数组的引用计数指针,数组元素为指向刻面的引用计数指针:复制本地环境只会复制一个指针,并增加几个引用计数。为维护标准 C++ 库的线程安全保证(不同对象上的操作始终为线程安全),本地环境引用计数和每个刻面的引用计数都以线程安全方式更新,类似 std::shared_ptr。
成员类型
类型 | 描述 |
刻面索引类型:每个刻面类必须声明或继承一个此类型的公开静态成员 (类) | |
所有刻面类别的基类:任何类别的每个刻面都会从此类型派生 (类) | |
category |
int (typedef) |
成员常量
名称 | 解释 |
const category none [静态] |
零值,指示无刻面类别 (公开静态成员常量) |
const category collate [静态] |
位掩码值,指示校排刻面类别 (公开静态成员常量) |
const category ctype [静态] |
位掩码值,指示 ctype 刻面类别 (公开静态成员常量) |
const category monetary [静态] |
位掩码值,指示货币刻面类别 (公开静态成员常量) |
const category numeric [静态] |
位掩码值,指示数值刻面类别 (公开静态成员常量) |
const category time [静态] |
位掩码值,指示时间刻面类别 (公开静态成员常量) |
const category messages [静态] |
位掩码值,指示消息刻面类别 (公开静态成员常量) |
const category all [静态] |
collate | ctype | monetary | numeric | time | messages (公开静态成员常量) |
对于 std::locale
的要求有类型 category
的实参的成员函数,该实参必须是以上列出的类别值之一,或它们之中两者或多者的并集。不接受 LC
常量。
成员函数
构造新的本地环境 (公开成员函数) | |
析构本地环境和其引用计数变为零的刻面 (公开成员函数) | |
替换本地环境 (公开成员函数) | |
以复制自另一本地环境的编译时鉴别的刻面构造本地环境 (公开成员函数) | |
返回本地环境的名称,或若它无名则为 "*" (公开成员函数) | |
(C++26) |
返回本地环境关联的字符编码方案 (公开成员函数) |
(C++20 中移除) |
本地环境对象之间的相等性比较 (公开成员函数) |
用此本地环境的校排刻面以字典序比较两个字符串 (公开成员函数) | |
[静态] |
更改全局本地环境 (公开静态成员函数) |
[静态] |
获得到 "C" 本地环境的引用 (公开静态成员函数) |
示例
演示本地环境影响的程序(跨平台)的典型前文
运行此代码
#include <iostream> #include <locale> int main() { std::wcout << L"用户偏好的本地环境设置是 " << std::locale("").name().c_str() << L'\n'; // 在启动时,全局本地环境是 "C" 本地环境 std::wcout << 1000.01 << L'\n'; // 以用户偏好的本地环境替换 C++ 全局本地环境和 C 本地环境 std::locale::global(std::locale("")); // 将来的宽字符输出会使用新的全局本地环境 std::wcout.imbue(std::locale()); // 再次输出同一数字 std::wcout << 1000.01 << L'\n'; }
可能的输出:
用户偏好的本地环境设置是 en_US.UTF8 1000.01 1,000.01
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 340 | C++98 | 所有本地环境都要保有的标准平面集合不明确 | 使之明确 |
LWG 347 | C++98 | category 类型的形参可以接受 LC 常量
|
不再接受 |
参阅
(C++26) |
描述了一个用于访问IANA 字符集注册表的接口。 (类) |
从本地环境获得一个刻面 (函数模板) | |
检查本地环境是否实现特定的刻面 (函数模板) | |
设置本地环境 ( std::ios_base 的公开成员函数) | |
返回当前本地环境 ( std::ios_base 的公开成员函数) |