std::setlocale详解

头文件

#include <clocale>

作用

std::setlocale是C++标准库中的一个函数,用于设置当前程序的本地化(locale)环境。

setlocale 函数安装指定的系统本地环境或其一部分,作为新的 C 本地环境。

修改保持效果,并影响所有关乎本地环境的 C 库函数执行,到下次调用 setlocale 为止。

原型

原型如下:

char* setlocale(int category, const char* locale);

category参数

category:指定要设置的本地化环境的类别,包括以下值:

LC_ALL:所有本地化设置
LC_COLLATE:字符串比较和排序规则
LC_CTYPE:字符分类和转换规则
LC_MONETARY:货币格式
LC_NUMERIC:数值格式
LC_TIME:日期和时间格式

locale参数

locale:指定要设置的本地化环境的名称或字符串。有以下几种输入格式:

“C”

将本地化环境设置为默认的C语言环境。

在程序启动时,将执行以下语句的等效项:

setlocale( LC_ALL, "C" );    //运行库调用,无需用户手动调用

NULL

获取当前的本地化环境设置。

示例:

char* pLocale = setlocale(LC_ALL, nullptr);

结果:

1

因为在程序启动时,将执行以下语句的等效项: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);

结果:

2

language语言字符串可选:

语言字符串 | Microsoft Learn

country国家/地区字符串可选:

国家-地区字符串 | Microsoft Learn

codepage代码页字符串可选:

代码页标识符 - Win32 apps | Microsoft Learn

其他参数值的验证方式同前,因此后面不再赘述。

“.OCP”

将设置区域设置为从操作系统获得的当前 OEM 代码页。 区域设置名称设置为由 GetUserDefaultLocaleName 返回的值。 代码页设置为由 GetLocaleInfoEx 返回的用户默认区域设置名称的 LOCALE_IDEFAULTCODEPAGE 值。

示例:

//".OCP"
char* pOCP = setlocale(LC_ALL, ".OCP");

结果:

3

“.ACP”

将区域设置设定为从操作系统获得的 ANSI 代码页。 区域设置名称设置为由 GetUserDefaultLocaleName 返回的值。 代码页设置为由 GetLocaleInfoEx 返回的用户默认区域设置名称的 LOCALE_IDEFAULTANSICODEPAGE 值。

示例:

//".ACP"
char* pACP = setlocale(LC_ALL, ".ACP");

结果:
4

localename

将区域设置设定为由 localename指示的区域设置名称。 代码页设置为由 GetLocaleInfoEx 返回的指定区域设置名称的 LOCALE_IDEFAULTANSICODEPAGE 值。

示例:

//"localename"
char* pLocaleName = setlocale(LC_ALL, "zh-HK");
//查看设置后的效果
char* pNewLC = setlocale(LC_ALL, nullptr);

结果:
5

localename语言环境字符串参考该链接中的附录 A:产品行为,参阅其中表内的“语言标记”列:

[MS-LCID]: Appendix A: Product Behavior | Microsoft Learn

“language”

将区域设置设定为由 指示的语言,为指定的语言使用默认国家/地区,为从主机操作系统获取的国家/地区使用用户默认的 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);

结果:
6

language语言字符串可选值:

语言字符串 | Microsoft Learn

“language_country”

将区域设置设定为由 和 指示的语言和国家/地区,以及从主机操作系统获得的默认代码页。 代码页设置为由 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);

结果:
7

language语言字符串可选:

语言字符串 | Microsoft Learn

country国家/地区字符串可选:

国家-地区字符串 | Microsoft Learn

“language_country.code-page”

将区域设置设定为由 、 和 <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");

结果:
8

输入配置有冲突时,主要注意以下两种情况:

①语言和国家/地区默认语言冲突:以国家/地区默认语言为准

②语言和代码页冲突时:最终设置的语言同①,代码页则以设置的为准

示例:

//输入配置有冲突时
//语言和代码页冲突
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");

结果:
9

language语言字符串可选:

语言字符串 | Microsoft Learn

country国家/地区字符串可选:

国家-地区字符串 | Microsoft Learn

代码页标识符可选值:

代码页标识符 - Win32 apps | Microsoft Learn

“.code-page”

将代码页设置为由 <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");

结果:
10

代码页标识符可选值:

代码页标识符 - Win32 apps | Microsoft Learn

返回值

函数返回值为指向字符串的指针,表示当前设置的本地化环境。

操作系统不支持所请求的本地化环境或缺少相关的本地化环境设置,则返回NULL。

注意

程序启动过程中,运行任何用户代码前会执行 std::setlocale(LC_ALL, “C”); 的等价代码。

尽管返回类型为 char* ,修改被指向的字符是未定义行为。

附录

相关参考:

setlocale,_wsetlocale | Microsoft Learn

区域设置名称、语言和国家-地区字符串 | Microsoft Learn

[MS-LCID]: Appendix A: Product Behavior | Microsoft Learn

语言字符串 | Microsoft Learn

国家-地区字符串 | Microsoft Learn

代码页标识符 - Win32 apps | Microsoft Learn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/318319.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端杂七杂八系列篇一

后端杂七杂八系列篇一 ① MySQL选择合适的数据类型① Char与Varchar② Text与Blob ② EqualsAndHashCode(callSuper true)的作用③ mybatis-plus 相关① 主键生成策略② 使用Model实现CRUD③ Wrapper的用法① Wrapper的继承关系② 项目中最常用的warpper [LambdaQueryWrapper]…

drf知识--10

接口文档 # 后端把接口写好后&#xff1a; 登录接口&#xff1a;/api/v1/login ---> post---name pwd 注册接口 查询所有图书带过滤接口 # 前后端需要做对接&#xff0c;对接第一个东西就是这个接口文档&#xff0c;前端照着接口文档开发 公司3个人&#xff…

50、实战 - 利用 conv + bn + relu + add 写一个残差结构

上一节介绍了残差结构,还不清楚的同学可以返回上一节继续阅读。 到了这里,一个残差结构需要的算法基本都介绍完了,至少在 Resnet 这种神经网络中的残差结构是这样的。 本节我们做一个实战,基于之前几节中手写的 conv / bn 算法,来搭建一个残差结构。其中,relu 的实现和…

StratifiedGroupKFold解释和代码实现

StratifiedGroupKFold解释和代码实现 文章目录 一、StratifiedGroupKFold解释和代码实现是什么&#xff1f;二、 实验数据设置2.1 实验数据生成代码2.2 代码结果 三、实验代码3.1 实验代码3.2 实验结果3.3 结果解释 四、样本类别类别不平衡 一、StratifiedGroupKFold解释和代码…

AUTOSAR软件架构描述文档,AUTOSAR_EXP_LayeredSoftwareArchitecture

AUTOSAR软件架构描述文档&#xff0c;我们常见的经典的CP架构及OS双核等架构描述 下载链接&#xff1a;https://www.autosar.org/fileadmin/standards/R21-11/CP/AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf

每日一练:LeeCode-503. 下一个更大元素 II (中)【单调栈】

本文是力扣LeeCode-503. 下一个更大元素 II 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个…

【hyperledger-fabric】部署和安装

简介 对hyperledger-fabric进行安装&#xff0c;话不多说&#xff0c;直接开干。但是需要申明一点&#xff0c;也就是本文章全程是开着加速器进行的资源操作&#xff0c;所以对于没有开加速器的情况可能会由于网络原因导致下载资源失败。 资料提供 1.官方部署文档在此&#…

动手学深度学习一:环境安装与数据学习

2024&#xff0c;重新开始深度学习。 第一步&#xff1a;李沐动手学深度学习 课程网址&#xff1a;https://courses.d2l.ai/zh-v2/ 包含教材和视频网址链接 Jupyter notebook安装 目前在本地先使用cpu版本pytorch&#xff0c;我的本地已经安装好conda&#xff0c;跟着教材创建…

闭着眼睛都要会的Linux命令

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

互联网加竞赛 Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; Yolov安全帽佩戴检测 危险区域进入检测 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&am…

从零开始了解大数据(七):总结

系列文章目录 从零开始了解大数据(一)&#xff1a;数据分析入门篇-CSDN博客 从零开始了解大数据(二)&#xff1a;Hadoop篇-CSDN博客 从零开始了解大数据(三)&#xff1a;HDFS分布式文件系统篇-CSDN博客 从零开始了解大数据(四)&#xff1a;MapReduce篇-CSDN博客 从零开始了解大…

1_并发编程_线程的基本概念和线程终止及线程问题排查

1.线程的运行状态 在Java中&#xff0c;线程的状态一共是6种状态&#xff0c;分别是 NEW&#xff1a;初始状态&#xff0c;线程被构建&#xff0c;但是还没有调用start方法 RUNNABLED&#xff1a;运行状态&#xff0c;JAVA线程把操作系统中的就绪和运行两种状态统一称为“运行…