std::setlocale

xwbar的头像
2025-06-15 02:56:51
/
中国勇夺世界杯

C++

编译器支持

独立式和宿主式

语言

标准库

标准库头文件

具名要求

特性测试宏 (C++20)

语言支持库

概念库 (C++20)

诊断库

内存管理库

元编程库 (C++11)

通用工具库

容器库

迭代器库

范围库 (C++20)

算法库

字符串库

文本处理库

数值库

日期和时间库

输入/输出库

文件系统库 (C++17)

并发支持库 (C++11)

执行控制库 (C++26)

技术规范

符号索引

外部库

[编辑] 文本处理库

本地化库

正则表达式库 (C++11)

格式化库 (C++20)

空终止序列工具

字节字符串

多字节字符串

宽字符串

原始数值转换

to_chars(C++17)

to_chars_result(C++17)

from_chars(C++17)

from_chars_result(C++17)

chars_format(C++17)

文本编码标识

text_encoding(C++26)

[编辑] 本地化库

区域设置和 facets

区域设置

has_facet

use_facet

locale

Facet 类别基类

ctype_base

codecvt_base

messages_base

time_base

money_base

ctype facets

ctype

ctype

ctype_byname

codecvt

codecvt_byname

数值 facets

num_get

num_put

numpunct

numpunct_byname

collate facets

collate

collate_byname

时间 facets

time_get

time_put

time_get_byname

time_put_byname

货币 facets

money_get

money_put

moneypunct

moneypunct_byname

messages facets

messages

messages_byname

字符分类和转换

字符分类

isspace

iscntrl

isupper

islower

isalpha

ispunct

isdigit

isxdigit

isalnum

isblank(C++11)

isprint

isgraph

字符转换

toupper

tolower

字符串和流转换

wstring_convert(C++11/17/26*)

wbuffer_convert(C++11/17/26*)

Unicode 转换 facets

codecvt_utf8(C++11/17/26*)

codecvt_utf16(C++11/17/26*)

codecvt_utf8_utf16(C++11/17/26*)

codecvt_mode(C++11/17/26*)

C 库区域设置

LC_ALLLC_COLLATELC_CTYPELC_MONETARYLC_NUMERICLC_TIME

setlocale

localeconv

lconv

[编辑]

定义于头文件

char* setlocale( int category, const char* locale );

setlocale 函数安装指定的系统区域设置或其部分作为新的 C 区域设置。这些修改持续有效,并影响所有区域设置敏感的 C 库函数的执行,直到下次调用 setlocale。如果 locale 是一个空指针,setlocale 查询当前的 C 区域设置而不修改它。

目录

1 参数

2 返回值

3 注释

4 示例

5 参见

6 外部链接

[编辑] 参数

category

-

区域设置类别标识符,LC_xxx 宏之一。可以是 ​0​。

locale

-

系统特定的区域设置标识符。可以是 "" 表示用户首选的区域设置,或者 "C" 表示最小的区域设置

[编辑] 返回值

指向一个窄的空终止字符串的指针,该字符串标识应用更改(如果有)后的 C 区域设置;如果失败,则为空指针。

返回字符串的副本以及在此 std::setlocale 调用中使用的类别,可以在程序稍后使用,以将区域设置恢复到此调用结束时的状态。

[编辑] 注释

在程序启动期间,在任何用户代码运行之前,会执行等效于 std::setlocale(LC_ALL, "C"); 的操作。

尽管返回类型是 char*,但修改指向的字符是未定义的行为。

由于 setlocale 修改了影响区域设置相关函数执行的全局状态,因此从一个线程调用它是未定义的行为,而另一个线程正在执行以下任何函数:std::fprintf, std::isprint, std::iswdigit, std::localeconv, std::tolower, std::fscanf, std::ispunct, std::iswgraph, std::mblen, std::toupper, std::isalnum, std::isspace, std::iswlower, std::mbstowcs, std::towlower, std::isalpha, std::isupper, std::iswprint, std::mbtowc, std::towupper, std::isblank, std::iswalnum, std::iswpunct, std::setlocale, std::wcscoll, std::iscntrl, std::iswalpha, std::iswspace, std::strcoll, std::wcstod, std::isdigit, std::iswblank, std::iswupper, std::strerror, std::wcstombs, std::isgraph, std::iswcntrl, std::iswxdigit, std::strtod, std::wcsxfrm, std::islower, std::iswctype, std::isxdigit。

POSIX 还定义了一个名为 "POSIX" 的区域设置,它始终可访问,并且与默认的最小 "C" 区域设置完全等效。

POSIX 还规定,后续对 setlocale 的调用可能会使返回的指针(而不仅仅是指向字符串的内容)失效。

[编辑] 示例

运行此代码

#include

#include

#include

#include

#include

#include

int main()

{

// Make a "deep copy" of current locale name.

std::string prev_loc = std::setlocale(LC_ALL, nullptr);

// The C locale will be UTF-8 enabled English,

// decimal dot will be German,

// date and time formatting will be Japanese.

if (const char* loc = std::setlocale(LC_ALL, "en_US.UTF-8"))

std::wprintf(L"New LC_ALL locale: %s\n", loc);

if (const char* loc = std::setlocale(LC_NUMERIC, "de_DE.UTF-8"))

std::wprintf(L"New LC_NUMERIC locale: %s\n", loc);

if (const char* loc = std::setlocale(LC_TIME, "ja_JP.UTF-8"))

std::wprintf(L"New LC_TIME locale: %s\n", loc);

wchar_t buf[100];

std::time_t t = std::time(nullptr);

std::wcsftime(buf, std::size(buf), L"%A %c", std::localtime(&t));

std::wprintf(L"Number: %.2f\nDate: %Ls\n", 3.14, buf);

// Restore the previous locale.

if (const char* loc = std::setlocale(LC_ALL, prev_loc.c_str()))

std::wprintf(L"Restorred LC_ALL locale: %s\n", loc);

}

可能的输出

New LC_ALL locale: en_US.UTF-8

New LC_NUMERIC locale: de_DE.UTF-8

New LC_TIME locale: ja_JP.UTF-8

Number: 3,14

Date: 日曜日 2022年11月06日 20時40分59秒

Restorred LC_ALL locale: C

[编辑] 参见

LC_ALLLC_COLLATELC_CTYPELC_MONETARYLC_NUMERICLC_TIME

std::setlocale 的区域设置类别 (宏常量) [编辑]

locale

封装文化差异的多态 facets 集合 (类) [编辑]

setlocale 的 C 文档

[编辑] 外部链接

1.

Windows 区域设置名称列表.

2.

Linux 区域设置名称列表.

AUTODESK/欧特克软件
2002年韩日世界杯介绍