当前位置: C语言 -- 标准库 -- <locale.h> -- setlocale

setlocale函数


概要:
#include <locale.h>
char *setlocale(int category, const char *locale);

描述:

该函数选择由参数category和参数locale指定的程序语言环境的适当部分;该函数可用于更改或者查询整个当前语言环境或者部分当前语言环境。

如果参数locale值为"C",将指定C程序编译的最小语言环境;如果参数locale值为"",将指定特定语言环境的本地环境。参数locale还可能是其它实现定义的字符串。


C程序启动时执行"C"语言环境,等同于执行以下语句:

setlocale(LC_ALL, "C");

"C"语言环境在所有系统和编译器上设置是相同的,因此该语言环境下程序的运行结果是可以预测的。


如果要使用本地默认的语言环境,可使用以下语句进行设置:

setlocale(LC_ALL, "");


如果要获取当前语言环境,可使用以下语句:

setlocale(LC_ALL, NULL);


setlocale函数的调用可能会与setlocale函数的其它调用或者受当前语言环境影响的函数调用产生数据竞争。实现应像没有库函数调用setlocale函数一样。


参数:
int category

category为下述值之一:

描述
LC_ALL 该宏确定语言环境所有类别的值,影响整个语言环境。
LC_COLLATE 该宏确定语言环境中字符的排序规则,影响strcollwcscollstrxfrmwcsxfrm函数。
LC_CTYPE 该宏确定语言环境中的字符分类和大小写转换,影响字符处理函数(<ctype>头文件中声明的函数,isdigitisxdigit函数除外。)、多字节字符函数、宽字符函数。
LC_MONETARY 该宏确定语言环境中的货币格式,影响localeconv函数返回的货币格式。
LC_NUMERIC 该宏确定语言环境中数字的非货币格式,影响格式化输入/输出函数和字符串转换函数的小数点字符以及localeconv函数返回的非货币格式信息。
LC_TIME 该宏确定语言环境中的日期和时间格式,影响strftimewcsftime函数。

const char *locale

locale为下述值之一:

1、特定值

描述
"C" 指定C程序编译的最小语言环境。
"" 指定本地默认的语言环境。
空指针 获取当前语言环境,但不改变当前语言环境。
"POSIX" 等价于"C"

"C"""、空指针都是ISO/IEC 9899:2018标准支持的locale值,支持ISO/IEC 9899:2018标准的C编译器都可以使用这三个locale值;"POSIX"ISO/IEC/IEEE 9945:2009标准中提供的locale值,是否支持以及如何支持各编译器差异较大。


2、格式化值

参数locale也可能具有以下格式化值。

language[_territory][.codeset][@modifier]

该值是实现提供的语言环境,其中语言(language)、地区(territory)和代码集codeset)的设置由具体实现定义。[ ]中的字段是可选的。如果设置的语言环境类别是LC_COLLATELC_CTYPELC_MONETARYLC_NUMERIC或者LC_TIME,可以附加字段@modifier,这允许用户在单个类别中选择本地化数据的特定实例。


ISO 639标准对全球500多种语言进行了编码,以汉语为例,其对应的2字母编码为zh,更完整的语言编码请查阅ISO官网ISO 3166标准对国家进行了编码,以中国为例,其对应的2字母编码为CN,更完整的国家编码请查阅ISO官网。下面是两个根据上述标准设置语言环境的例子:

setlocale(LC_CTYPE, "zh_CN");

setlocale(LC_MONETARY, "fr_FR");


实现还可能支持其它形式的格式化值。Windows系统支持的locale值请查阅此网页Visual Studio编译器可以使用语言环境名(locale-name)用作locale值。语言环境名是IETF标准化的短字符串,例如:"zh-CN""en-US"等等。


返回值:

如果语言环境设置成功,函数返回一个指向与新语言环境指定类别相关联的字符串的指针;如果语言环境设置不成功,函数返回一个空指针,程序的语言环境保持不变。

如果参数locale是空指针,函数返回一个指向与当前语言环境指定类别相关联的字符串的指针,并且程序的语言环境保持不变。

setlocale函数返回的指向字符串的指针可以用作后续恢复程序的语言环境;该字符串不能被程序修改,但可以被后续setlocale函数调用覆盖。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
/*函数setlocale范例*/

#include <locale.h>
#include <stdio.h>

int main(void)
{
    printf("Locale: %s\n", setlocale(LC_ALL, NULL));

    setlocale(LC_ALL,"");
    printf("Locale: %s\n", setlocale(LC_ALL, NULL));

    setlocale(LC_ALL, "en-GB");
    printf("Locale: %s\n", setlocale(LC_ALL, NULL));

    return 0;
}

输出:

Locale: C

Locale: Chinese (Simplified)_China.936

Locale: en-GB

注:使用Visual Studio编译。


相关内容:
struct lconv 表示数值格式的类型。
localeconv 返回struct lconv类型指针的函数。