setlocale
定义于头文件 <locale.h>
|
||
char* setlocale( int category, const char* locale); |
||
setlocale
函数安装指定的系统本地环境或其一部分,作为新的 C 本地环境。修改保持效果,并影响所有关乎本地环境的 C 库函数执行,到下次调用 setlocale
为止。若 locale
为空指针,则 setlocale
查询当前 C 本地环境而不修改它。
参数
category | - | 本地环境类别标识符, LC_xxx 宏之一。可为 0 。 |
locale | - | 系统限定的本地环境标识符。对于操作系统的环境支持字段为命令行“ locale -a ”的合法列出内容值,对于用户偏好的本地环境为 "" ,对于最小本地环境为 "C" 。 |
返回值
指向窄空终止字符串的指针,它表示应用更改后的 C 本地环境,若存在。或在失败时为空指针。
返回字符串的副本和到 setlocale
的此调用中所用的类别,可在程序的后面用来恢复本地环境到此调用结束时的状态。
注解
程序启动过程中,运行任何用户代码前会执行 setlocale(LC_ALL, "C"); 的等价代码。
尽管返回类型为 char* ,修改被指向的字符是未定义行为。
因为 setlocale
修改影响依赖本地环境的函数执行的全局状态,故而一个线程调用它,同时另一个线程执行任何下列函数是未定义行为:fprintf 、 isprint 、 iswdigit 、 localeconv 、 tolower 、 fscanf 、 ispunct 、 iswgraph 、 mblen 、 toupper 、 isalnum 、 isspace 、 iswlower 、 mbstowcs 、 towlower 、 isalpha 、 isupper 、 iswprint 、 mbtowc 、 towupper 、 isblank 、 iswalnum 、 iswpunct 、 setlocale 、 wcscoll 、 iscntrl 、 iswalpha 、 iswspace 、 strcoll 、 wcstod 、 isdigit 、 iswblank 、 iswupper、 strerror 、 wcstombs 、 isgraph 、 iswcntrl 、 iswxdigit 、 strtod 、 wcsxfrm 、 islower 、 iswctype 、 isxdigit 。
POSIX 亦定义名为 "POSIX" 的本地环境,它始终可访问,并准确等于默认的最小 "C" 本地环境。
POSIX 亦指定后继的 setlocale
调用可以非法化返回的指针,而不仅是被指向的字符串内容。
示例
#include <stdio.h> #include <locale.h> #include <time.h> #include <wchar.h> int main(void) { // C 本地环境将为启用 UTF-8 的英文; // 小数点将为德文 // 日期和时间格式将为日文 setlocale(LC_ALL, "en_US.UTF-8"); setlocale(LC_NUMERIC, "de_DE"); setlocale(LC_TIME, "ja_JP"); wchar_t str[100]; time_t t = time(NULL); wcsftime(str, 100, L"%A %c", localtime(&t)); wprintf(L"Number: %.2f\nDate: %ls\n", 3.14, str); }
可能的输出:
Number: 3,14 Date: 木曜日 2014年11月06日 09時58分56秒
引用
- C17 标准(ISO/IEC 9899:2018):
- 7.11.1.1 The setlocale function (p: 163-164)
- C11 标准(ISO/IEC 9899:2011):
- 7.11.1.1 The setlocale function (p: 224-225)
- C99 标准(ISO/IEC 9899:1999):
- 7.11.1.1 The setlocale function (p: 205-206)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.4.1.1 The setlocale function
参阅
setlocale 所用的本地环境类别 (宏常量) |