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 的语言环境。
*
要在名称中使用具有 UNI 的类别,必须在编译命令上指定 LOCALETYPE (*LOCALEUCS2) 或 LOCALETYPE (*LOCALEUTF)。 如果使用 LOCALETYPE (*LOCALEUCS2) ,那么指定的语言环境必须是 UCS-2 语言环境。 如果使用 LOCALETYPE (*LOCALEUTF) ,那么指定的语言环境必须是 UTF-32 语言环境。
注: 定义 setlocale() 和其他区分语言环境的 C 函数有两种方法。 定义 setlocale() 的原始方法使用 *CLD 语言环境对象来设置语言环境和检索语言环境敏感数据。 定义 setlocale() 的第二种方法使用 *LOCALE 对象来设置语言环境并检索语言环境敏感数据。 通过在编译命令上指定 LOCALETYPE (*CLD) 来访问原始方法。 通过在编译命令上指定 LOCALETYPE (*LOCALE) , LOCALETYPE (*LOCALEUCS2) 或 LOCALETYPE (*LOCALEUTF) 来访问第二种方法。 有关 ILE C中语言环境定义的两种方法的更多信息,请参阅 ILE C/C++ 程序员指南中的 "国际语言环境支持" 部分。

使用 *CLD 语言环境对象的 setlocale

您可以将 locale 的值设置为 "C", "" , LC_CLC_C_GERMANYLC_C_C_FRANCELC_C_SPAINLC_ITALYLC_C_USALC_C_UKlocale"C" 表示缺省 C 环境。 locale 值 "" 指示 setlocale() 函数将缺省语言环境用于实现。

具有 *LOCALE 对象的 setlocale

可以将 locale 的值设置为 """C""POSIX"或用双引号括起的 *LOCALE 对象的标准 Integrated File System 路径名。 locale"C""POSIX" 指示缺省 C *LOCALE 对象。 locale"" 指示 setlocale() 函数对进程使用缺省语言环境。

使用下表确定进程的缺省语言环境:
类别 缺省语言环境
LC_ALL
  1. 检查 LC_ALL 环境变量1。 如果定义为非空,请对所有 POSIX 语言环境类别使用指定的语言环境2 。 否则,请转到下一步。
  2. 对于每个 POSIX 语言环境类别 (LC_CTYPE , LC_COLLATE , LC_TIME , LC_NUMERIC , LC_MESSAGES ,LC_货币和 LC_TOD) ,请检查同名的环境变量1。 如果它已定义且不为空,请使用指定的语言环境2。 否则,请转到下一步。
  3. 检查 LANG 环境变量1。 对于上一步中未设置的每个语言环境类别,如果 LANG 环境变量已定义且不为空,请将语言环境类别设置为指定的语言环境2。 否则,将其设置为缺省 C *LOCALE 对象。
LC_CTYPE
LC_COLLATE
LC_TIME
LC_NUMERIC
LC_MESSAGES
LC_货币
LC_TOD
  1. 检查 LC_ALL 环境变量1。 如果定义为非空,请使用指定的语言环境2。 否则,请转到下一步。
  2. 检查与指定语言环境类别同名的环境变量1 。 如果它已定义且不为空,请使用指定的语言环境2。 否则,请转到下一步。
  3. 检查 LANG 环境变量1。 如果定义为非空,请将语言环境类别设置为指定的语言环境2。 否则,请转到下一步。
  4. 将语言环境类别设置为缺省 C *LOCALE 对象。
LC_UNI_ALL

如果使用 LOCALETYPE (*LOCALEUCS2) 选项编译模块:

  1. 检查 LC_UCS2_ALL 环境变量1。 如果它已定义且不为空,请将指定的语言环境用于所有 Unicode 语言环境类别。 否则,请转到下一步。
  2. 对于每个 Unicode 语言环境类别,请检查相应的环境变量1 (LC_UCS2_CTYPE, LC_UCS2_COLLATE, LC_UCS2_TIME, LC_UCS2_NUMERIC, LC_UCS2_MESSAGES, LC_UCS2_MONETARY或 LC_UCS2_TOD)3。 如果它已定义且不为空,请使用指定的语言环境。 否则,请转到下一步。
  3. 将语言环境类别设置为缺省 UCS-2 *LOCALE 对象。

如果使用 LOCALETYPE (*LOCALEUTF) 选项编译模块:

  1. 检查 LC_UTF_ALL 环境变量1。 如果它已定义且不为空,请将指定的语言环境用于所有 Unicode 语言环境类别。 否则,请转到下一步。
  2. 对于每个 Unicode 语言环境类别,请检查相应的环境变量1 (LC_UTF_CTYPE , LC_UTF_COLLATE , LC_UTF_TIME ,LC_UTF_NUM李家祥, LC_UTF_MESSAGES ,LC_UTF_MONE旋转或 LC_UTF_TOD)3。 如果它已定义且不为空,请使用指定的语言环境。 否则,请转到下一步。
  3. 检查 LANG 环境变量1。 对于上一步中未设置的每个语言环境类别,如果定义了 LANG 环境变量并且该变量不为空,请将该语言环境类别设置为指定的语言环境。 否则,将其设置为缺省 UTF *LOCALE 对象。
LC_UNI_CTYPE
LC_UNI_COLLATE
LC_UNI_TIME
LC_UNI_NUMERIC
LC_UNI_MESSAGES
LC_UNI_货币
LC_UNI_TOD

如果使用 LOCALETYPE (*LOCALEUCS2) 选项编译模块:

  1. 检查对应于指定语言环境类别1 (LC_UCS2_CTYPE, LC_UCS2_COLLATE, LC_UCS2_TIME, LC_UCS2_NUMERIC, LC_UCS2_MESSAGES, LC_UCS2_MONETARY或 LC_UCS2_TOD)3的环境变量。 如果它已定义且不为空,请使用指定的语言环境。 否则,请转到下一步。
  2. 检查 LC_UCS2_ALL 环境变量1。 如果它已定义且不为空,请使用指定的语言环境。 否则,请转到下一步。
  3. 将语言环境类别设置为缺省 UCS-2 *LOCALE 对象。

如果使用 LOCALETYPE (*LOCALEUTF) 选项编译模块:

  1. 检查对应于指定语言环境类别1 (LC_UTF_CTYPE , LC_UTF_COLLATE , LC_UTF_TIME ,LC_UTF_NUM李家祥, LC_UTF_MESSAGES ,LC_UTF_MONE环或 LC_UTF_TOD)3的环境变量。 如果它已定义且不为空,请使用指定的语言环境。 否则,请转到下一步。
  2. 检查 LC_UTF_ALL 环境变量1。 如果它已定义且不为空,请使用指定的语言环境。 否则,请转到下一步。
  3. 检查 LANG 环境变量1。 如果 LANG 环境变量已定义且不为空,请将语言环境类别设置为指定的语言环境。 否则,将其设置为缺省 UTF *LOCALE 对象。
注: 1 具有对应于语言环境类别的名称的环境变量由用户创建。 当您为以下任一项指定语言环境路径名时,将在作业启动期间自动创建 LANG 环境变量:期望语言环境变量包含格式为 /QSYS.LIB/<locname>.LOCALE/QSYS.LIB/<libname>.LIB/<locname>.LOCALE的语言环境路径名。 如果使用 LOCALETYPE (*LOCALEUTF) 选项编译模块,那么如果路径的 <locname> 部分超过 8 个字符,那么将忽略环境变量。 存在此限制,因为必须向语言环境名称追加 2 字符后缀以获取相应 UTF 语言环境的名称。
注: 2 当在编译命令上指定 LOCALETYPE (*LOCALEUTF) 时, 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) 创建的语言环境。
注: 3 LC_UNI_ALL , LC_UNI_COLLATE , LC_UNI_CTYPE , LC_UNI_TIME , LC_UNI_NUMERIC , LC_UNI_MESSAGES ,LC_UNI_货币和 LC_UNI_TOD 语言环境类别名称在 UCS-2 和 UTF 之间共享。 无法共享与这些类别对应的环境变量,因此环境变量的名称与语言环境类别名称不完全匹配。 对于 UCS-2 环境变量名称, UNI 将替换为 UCS2 (例如, LC_UNI_ALL 语言环境类别变为 LC_UCS2_ALL 环境变量)。 对于 UTF 环境变量名称, UNI 将替换为 UTF (例如, LC_UNI_ALL 语言环境类别变为 LC_UTF_ALL 环境变量)。

如果使用 LOCALETYPE (*LOCALEUCS2) 或 LOCALETYPE (*LOCALEUTF) 进行编译,那么语言环境必须是指向以 LC_UNI_ 开头的类别的有效 Unicode 语言环境的指针,并且不能是其他类别的 Unicode 语言环境。

返回值

setlocale() 函数返回一个指向表示当前语言环境设置的字符串的指针。 如果存储了返回的字符串,那么可以将存储的字符串值用作 setlocale() 函数的输入,以随时恢复语言环境设置。 但是,您需要将该字符串复制到用户定义的缓冲区; 否则,在后续调用 setlocale()时将覆盖该字符串。

注: 由于对 setlocale() 点的成功调用可能被对 setlocale() 函数的后续调用覆盖的字符串,因此如果您计划稍后使用该字符串,那么应该复制该字符串。 语言环境字符串的准确格式在语言环境类型 *CLD , *LOCALE , *LOCALEUCS2和 *LOCALEUTF 之间不同。
要查询语言环境,请提供 NULL 作为第二个参数。 例如,要查询语言环境的所有类别,请输入以下语句:
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);
}

相关信息