#include <clocale>
std::setlocale是C++标准库中的一个函数,用于设置当前程序的本地化(locale)环境。
setlocale 函数安装指定的系统本地环境或其一部分,作为新的 C 本地环境。
修改保持效果,并影响所有关乎本地环境的 C 库函数执行,到下次调用 setlocale 为止。
原型如下:
char* setlocale(int category, const char* locale);
category:指定要设置的本地化环境的类别,包括以下值:
LC_ALL:所有本地化设置
LC_COLLATE:字符串比较和排序规则
LC_CTYPE:字符分类和转换规则
LC_MONETARY:货币格式
LC_NUMERIC:数值格式
LC_TIME:日期和时间格式
locale:指定要设置的本地化环境的名称或字符串。有以下几种输入格式:
将本地化环境设置为默认的C语言环境。
在程序启动时,将执行以下语句的等效项:
setlocale( LC_ALL, "C" ); //运行库调用,无需用户手动调用
获取当前的本地化环境设置。
示例:
char* pLocale = setlocale(LC_ALL, nullptr);
结果:
因为在程序启动时,将执行以下语句的等效项:setlocale( LC_ALL, “C” );
因此程序运行后再获取到的本地化环境配置是“C”。
将区域设置设定为默认值,该值是从操作系统获得的用户默认的 ANSI 代码页。 区域设置名称设置为由 GetUserDefaultLocaleName 返回的值。 代码页设置为由 GetACP 返回的值。
示例:
//获取本地化环境配置
char* pLocal = setlocale(LC_ALL, nullptr);
//恢复默认配置
//获取语言环境名称
TCHAR tchLocaleName[MAX_PATH];
int nRet = GetUserDefaultLocaleName(tchLocaleName, MAX_PATH);
//获取代码页
int nAcp = GetACP();
//获取语言配置,同GetUserDefaultLocaleName
WCHAR wchLang[MAX_PATH];
int nLen = GetLocaleInfoEx(tchLocaleName, LOCALE_SLANGUAGE, wchLang, MAX_PATH);
//获取国家/地区
WCHAR wchCountry[MAX_PATH];
int nLen2 = GetLocaleInfoEx(tchLocaleName, LOCALE_SCOUNTRY, wchCountry, MAX_PATH);
char* pDefault = setlocale(LC_ALL, "");
char* pNewLC = setlocale(LC_ALL, nullptr);
结果:
language语言字符串可选:
country国家/地区字符串可选:
codepage代码页字符串可选:
代码页标识符 - Win32 apps | Microsoft Learn
其他参数值的验证方式同前,因此后面不再赘述。
将设置区域设置为从操作系统获得的当前 OEM 代码页。 区域设置名称设置为由 GetUserDefaultLocaleName 返回的值。 代码页设置为由 GetLocaleInfoEx 返回的用户默认区域设置名称的 LOCALE_IDEFAULTCODEPAGE 值。
示例:
//".OCP"
char* pOCP = setlocale(LC_ALL, ".OCP");
结果:
将区域设置设定为从操作系统获得的 ANSI 代码页。 区域设置名称设置为由 GetUserDefaultLocaleName 返回的值。 代码页设置为由 GetLocaleInfoEx 返回的用户默认区域设置名称的 LOCALE_IDEFAULTANSICODEPAGE 值。
示例:
//".ACP"
char* pACP = setlocale(LC_ALL, ".ACP");
结果:
将区域设置设定为由 localename指示的区域设置名称。 代码页设置为由 GetLocaleInfoEx 返回的指定区域设置名称的 LOCALE_IDEFAULTANSICODEPAGE 值。
示例:
//"localename"
char* pLocaleName = setlocale(LC_ALL, "zh-HK");
//查看设置后的效果
char* pNewLC = setlocale(LC_ALL, nullptr);
结果:
localename语言环境字符串参考该链接中的附录 A:产品行为,参阅其中表内的“语言标记”列:
[MS-LCID]: Appendix A: Product Behavior | Microsoft Learn
将区域设置设定为由 指示的语言,为指定的语言使用默认国家/地区,为从主机操作系统获取的国家/地区使用用户默认的 ANSI 代码页。
示例:
//"language"
//以下几种设置方式是等效的
char* pLocaleName = setlocale(LC_ALL, "en-US");
char* pLocaleName2 = setlocale(LC_ALL, "English");
char* pLocaleName3 = setlocale(LC_ALL, "English_United States.1252");
//查看设置后的效果
char* pNewLC = setlocale(LC_ALL, nullptr);r);
结果:
language语言字符串可选值:
将区域设置设定为由 和 指示的语言和国家/地区,以及从主机操作系统获得的默认代码页。 代码页设置为由 GetLocaleInfoEx 返回的指定区域设置名称的 LOCALE_IDEFAULTANSICODEPAGE 值。
示例:
//"language-country"
char* pLocale = setlocale(LC_ALL, "chinese-traditional_hong-kong");
//国家/地区字符串可缩写
char* pLocale2 = setlocale(LC_ALL, "chinese-traditional_HKG");
char* pLocale3 = setlocale(LC_ALL, "chinese-simplified_china");
//设置的语言和指定国家/地区的默认语言不一致时,会国家/地区的默认语言为准
//hong-kong默认语言为繁体(Codepage 950),这里即时设置语言为chinese-simplified,设置后也还是默认的繁体语言
char* pLocale4 = setlocale(LC_ALL, "chinese-simplified_hong-kong");
char* pLocale5 = setlocale(LC_ALL, "chinese-traditional_china");
//查看设置后的效果
char* pNewLC = setlocale(LC_ALL, nullptr);
结果:
language语言字符串可选:
country国家/地区字符串可选:
将区域设置设定为由 、 和 <code_page> 字符串指示的语言、国家/地区和代码页。 你可以使用语言、国家/地区和代码页的各种组合。
例如,此调用会将区域设置设定为“法语(加拿大)”并使用代码页 1252:
setlocale( LC_ALL, "French_Canada.1252" );
示例:
//"language_country.code-page"
char* pLocale = setlocale(LC_ALL, "chinese-traditional_hong-kong.950");
char* pLocale3 = setlocale(LC_ALL, "chinese-simplified_china.936");
char* pLocale4 = setlocale(LC_ALL, "english-us_america.1252");
结果:
输入配置有冲突时,主要注意以下两种情况:
①语言和国家/地区默认语言冲突:以国家/地区默认语言为准
②语言和代码页冲突时:最终设置的语言同①,代码页则以设置的为准
示例:
//输入配置有冲突时
//语言和代码页冲突
char* pLocale5 = setlocale(LC_ALL, "chinese-traditional_hong-kong.936");
char* pLocale6 = setlocale(LC_ALL, "chinese-simplified_hong-kong.936");
char* pLocale7 = setlocale(LC_ALL, "chinese-simplified_china.950");
char* pLocale8 = setlocale(LC_ALL, "chinese-traditional_china.950");
结果:
language语言字符串可选:
country国家/地区字符串可选:
代码页标识符可选值:
代码页标识符 - Win32 apps | Microsoft Learn
将代码页设置为由 <code_page> 指示的值,以及指定代码页的默认国家/地区和语言(由主机操作系统定义)。
示例:
//".code-page"
//GB2312
char* pLocale = setlocale(LC_ALL, ".936");
//BIG5
char* pLocale2 = setlocale(LC_ALL, ".950");
//UTF-8
char* pLocale3 = setlocale(LC_ALL, ".65001");
//UTF-16
char* pLocale4 = setlocale(LC_ALL, ".1200");
//big endian 字节顺序
char* pLocale5 = setlocale(LC_ALL, ".1201");
//UTF-32
//little endian 字节顺序
char* pLocale6 = setlocale(LC_ALL, ".12000");
// big endian 字节顺序;
char* pLocale7 = setlocale(LC_ALL, ".12001");
//ANSI
char* pLocale8 = setlocale(LC_ALL, ".1252");
结果:
代码页标识符可选值:
代码页标识符 - Win32 apps | Microsoft Learn
函数返回值为指向字符串的指针,表示当前设置的本地化环境。
操作系统不支持所请求的本地化环境或缺少相关的本地化环境设置,则返回NULL。
程序启动过程中,运行任何用户代码前会执行 std::setlocale(LC_ALL, “C”); 的等价代码。
尽管返回类型为 char* ,修改被指向的字符是未定义行为。
相关参考:
setlocale,_wsetlocale | Microsoft Learn
区域设置名称、语言和国家-地区字符串 | Microsoft Learn