setlocale ()- 设置语言环境
格式
#include <locale.h>
char *setlocale(int category, const char *locale);语言级别
ANSI
线程安全
False
语言环境敏感
有关更多信息,请参阅 了解 CCSID 和语言环境。
描述
setlocale() 函数会更改或查询 <locale.h> 包含文件中定义的变量,这些变量指示位置。 下面列出了 category 的值。
| 类别 | 目的 |
|---|---|
| LC_ALL | 指定程序的整个语言环境。 |
| LC_COLLATE | 影响 strcoll() 和 strxfrm() 函数的行为。 |
| LC_CTYPE | 影响字符处理函数的行为。 |
| LC_MONETARY | 影响 localeconv() 和 nl_langinfo() 函数返回的货币信息。 |
| LC_NUMERIC | 影响格式化输入/输出和字符串转换函数的小数点字符,以及 localeconv() 和 nl_langinfo() 函数返回的非货币格式信息。 |
| LC_TIME | 影响 strftime() 函数的行为以及 nl_langinfo() 函数返回的时间格式化信息。 |
| LC_TOD | 影响时间函数的行为。 类别 LC_TOD 中包含多个字段。 TNAME 字段是时区名称。 TZDIFF 字段是本地时间与格林威治子午线时间之间的差异。 如果 TNAME 字段为非空白,那么在确定某些时间函数返回的值时将使用 TZDIFF 字段。 此值优先于系统值 QUTCOFFSET。 |
| LC_UNI_ALL* | 此类别导致 setlocale() 从指定的语言环境装入所有 LC_UNI_ 类别。 此类别仅接受具有 UCS-2 或 UTF-32 CCSID 的语言环境。 |
| lc_uni_collate* | 影响 wcscoll() 和 wcsxfrm() 函数的行为。 此类别仅接受具有 UCS-2 或 UTF-32 CCSID 的语言环境。注: UCS-2不支持此类别。
|
| LC_UNI_CTYPE* | 影响宽字符处理函数的行为。 此类别仅接受具有 UCS-2 或 UTF-32 CCSID 的语言环境。 |
| lc_uni_messages* | 影响 _WCS_nl_langinfo() 函数返回的消息格式化信息。 此类别仅接受具有 UCS-2 或 UTF-32 CCSID 的语言环境。 |
| lc_uni_monetary* | 影响 wcslocaleconv() 和 _WCS_nl_langinfo() 函数返回的货币信息。 此类别仅接受具有 UCS-2 或 UTF-32 CCSID 的语言环境。 |
| lc_uni_numeric* | 影响宽字符格式化输入/输出和宽字符字符串转换函数的小数点字符,以及 wcslocaleconv() 和 _WCS_nl_langinfo() 函数返回的非货币信息。 此类别仅接受具有 UCS-2 或 UTF-32 CCSID 的语言环境。 |
| LC_UNI_TIME* | 影响 wcsftime() 函数的行为以及 _WCS_nl_langinfo() 函数返回的时间格式信息。 此类别仅接受具有 UCS-2 或 UTF-32 CCSID 的语言环境。 |
| LC_UNI_TOD* | 影响宽字符时间函数的行为。 此类别仅接受具有 UCS-2 或 UTF-32 CCSID 的语言环境。 |
|
|
setlocale() 和其他区分语言环境的 C 函数有两种方法。 定义 setlocale() 的原始方法使用 *CLD 语言环境对象来设置语言环境和检索语言环境敏感数据。 定义 setlocale() 的第二种方法使用 *LOCALE 对象来设置语言环境并检索语言环境敏感数据。 通过在编译命令上指定 LOCALETYPE (*CLD) 来访问原始方法。 通过在编译命令上指定 LOCALETYPE (*LOCALE) , LOCALETYPE (*LOCALEUCS2) 或 LOCALETYPE (*LOCALEUTF) 来访问第二种方法。 有关 ILE C中语言环境定义的两种方法的更多信息,请参阅 ILE C/C++ 程序员指南中的 "国际语言环境支持" 部分。使用 *CLD 语言环境对象的 setlocale
您可以将 locale 的值设置为 "C", "" , LC_C, LC_C_GERMANY, LC_C_C_FRANCE, LC_C_SPAIN, LC_ITALY, LC_C_USA 或 LC_C_UK。 locale 值 "C" 表示缺省 C 环境。 locale 值 "" 指示 setlocale() 函数将缺省语言环境用于实现。
具有 *LOCALE 对象的 setlocale
可以将 locale 的值设置为 "", "C", "POSIX"或用双引号括起的 *LOCALE 对象的标准 Integrated File System 路径名。 locale 值 "C" 或 "POSIX" 指示缺省 C *LOCALE 对象。 locale 值 "" 指示 setlocale() 函数对进程使用缺省语言环境。
| 类别 | 缺省语言环境 |
|---|---|
| LC_ALL |
|
LC_CTYPE
LC_COLLATE LC_TIME LC_NUMERIC LC_MESSAGES LC_货币 LC_TOD |
|
| LC_UNI_ALL | 如果使用 LOCALETYPE (*LOCALEUCS2) 选项编译模块:
如果使用 LOCALETYPE (*LOCALEUTF) 选项编译模块:
|
LC_UNI_CTYPE
LC_UNI_COLLATE LC_UNI_TIME LC_UNI_NUMERIC LC_UNI_MESSAGES LC_UNI_货币 LC_UNI_TOD |
如果使用 LOCALETYPE (*LOCALEUCS2) 选项编译模块:
如果使用 LOCALETYPE (*LOCALEUTF) 选项编译模块:
|
- 用户概要文件中的 LOCALE 参数 (请参阅 "信息中心" 中的 CHGUSRPRF (更改用户概要文件) 命令 信息)。
- QLOCALE 系统值 (请参阅信息中心中的 QLOCALE 系统值 信息)。
/QSYS.LIB/<locname>.LOCALE 或 /QSYS.LIB/<libname>.LIB/<locname>.LOCALE的语言环境路径名。 如果使用 LOCALETYPE (*LOCALEUTF) 选项编译模块,那么如果路径的 <locname> 部分超过 8 个字符,那么将忽略环境变量。 存在此限制,因为必须向语言环境名称追加 2 字符后缀以获取相应 UTF 语言环境的名称。setlocale() 函数将追加尾部_8到 LC_ALL , LC_CTYPE , LC_COLLATE , LC_TIME , LC_NUMERIC , LC_MESSAGES ,LC_货币, LC_TOD 和 LANG 环境变量。 如果找不到此语言环境,那么将使用 UTF 缺省语言环境对象。 例如,当 LANG 设置为 /QSYS.LIB/EN_US.LOCALE 时, setlocale(LC_ALL, "") 会导致 setlocale() 尝试装入语言环境 /QSYS.LIB/EN_US_8.LOCALE。 如果 LANG 环境变量用于设置其中一个 Unicode 语言环境类别 (LC_UNI_ALL , LC_UNI_CTYPE , LC_UNI_COLLATE , LC_UNI_TIME , LC_UNI_NUMERIC , LC_UNI_MESSAGES ,LC_UNI_货币或 LC_UNI_TOD) ,那么 setlocale() 会附加尾部_4到存储在环境变量中的语言环境名称。 这是尝试查找相应的 UTF-32 语言环境。 如果找不到此语言环境,那么将使用缺省 UTF-32 语言环境对象。 例如,当 LANG 设置为 /QSYS.LIB/EN_US.LOCALE 时, setlocale(LC_UNI_TIME, "") 会导致 setlocale() 尝试装入语言环境 /QSYS.LIB/EN_US_4.LOCALE。 语言环境名称以_4和_8遵循 CRTLOCALE CL 命令引入的命名约定 (请参阅 "信息中心" 中的 CRTLOCALE (创建语言环境) 命令 信息) ,以了解使用 CCSID (*UTF) 创建的语言环境。如果使用 LOCALETYPE (*LOCALEUCS2) 或 LOCALETYPE (*LOCALEUTF) 进行编译,那么语言环境必须是指向以 LC_UNI_ 开头的类别的有效 Unicode 语言环境的指针,并且不能是其他类别的 Unicode 语言环境。
返回值
setlocale() 函数返回一个指向表示当前语言环境设置的字符串的指针。 如果存储了返回的字符串,那么可以将存储的字符串值用作 setlocale() 函数的输入,以随时恢复语言环境设置。 但是,您需要将该字符串复制到用户定义的缓冲区; 否则,在后续调用 setlocale()时将覆盖该字符串。
setlocale() 点的成功调用可能被对 setlocale() 函数的后续调用覆盖的字符串,因此如果您计划稍后使用该字符串,那么应该复制该字符串。 语言环境字符串的准确格式在语言环境类型 *CLD , *LOCALE , *LOCALEUCS2和 *LOCALEUTF 之间不同。char *string = setlocale(LC_ALL, NULL);
错误条件数
发生错误时, setlocale() 函数会返回 NULL ,并且不会更改程序的语言环境。
使用 *CLD 语言环境对象的示例
/************************************************************************
This example sets the locale of the program to
LC_C_FRANCE *CLD and prints the string
that is associated with the locale. This example must be compiled with
the LOCALETYPE(*CLD) parameter on the compilation command.
************************************************************************/
#include <stdio.h>
#include <locale.h>
char *string;
int main(void)
{
string = setlocale(LC_ALL, LC_C_FRANCE);
if (string != NULL)
printf(" %s \n",string);
}使用 *LOCALE 对象的示例
/************************************************************************
This example sets the locale of the program to be "POSIX" and prints
the string that is associated with the locale. This example must be
compiled with the LOCALETYPE(*LOCALE) parameter on the CRTCMOD or
CRTBNDC command.
************************************************************************/
#include <stdio.h>
#include <locale.h>
char *string;
int main(void)
{
string = setlocale(LC_ALL, "POSIX");
if (string != NULL)
printf(" %s \n",string);
}