std::setlocale详解

news2024/12/27 11:04:12

头文件

#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.coloradmin.cn/o/1353036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3dmax全景图用什么渲染 全景图云渲染使用教程

在给客户展示设计概念时&#xff0c;应用3ds Max创建的全景图是一个高效直观的方法。这种方式不仅可以全方位地呈现整个空间&#xff0c;让客户沉浸式地感受设计师的创意&#xff0c;而且在展现大型空间设计&#xff0c;如展览馆或者会议室等&#xff0c;效果尤其显著&#xff…

使用Python进行用户参与度分析

用户参与度分析是一种数据驱动的方法&#xff0c;用于评估和了解用户对产品&#xff0c;服务或平台的参与&#xff0c;互动和满意度。它涉及分析各种指标和行为模式&#xff0c;以深入了解用户行为和偏好。它帮助企业做出明智的决策&#xff0c;以增强用户体验&#xff0c;优化…

广州怎么找工作哪里工作机会多

广州找工作上 吉鹿力招聘网 打开 吉鹿力招聘网 “注册账号”&#xff0c;然后输入个人基本信息&#xff0c;进行注册&#xff08;可使用手机号注册&#xff0c;也可以使用邮箱注册&#xff09;。 填写求职意向&#xff0c;基本信息点击“下一步”。 填写工作经历点击“下一步”…

算法巡练day04Leetcode24交换节点19删除倒数节点142环形链表

今天学习的文章和视频链接 https://www.bilibili.com/video/BV1YT411g7br/?vd_source8272bd48fee17396a4a1746c256ab0ae https://www.bilibili.com/video/BV1if4y1d7ob/?vd_source8272bd48fee17396a4a1746c256ab0ae 24两两交换链表中的节点 给你一个链表&#xff0c;两两…

yolov5 损失函数

yolov5有三个损失函数分别是回归损失、置信度损失、分类损失 回归损失用的是CIOU loss 置信度和分类损失用的是BCE loss &#xff08;1&#xff09;对比L2损失&#xff0c;Iou和GIou具有尺度不变性&#xff0c;不会说输入的框子大loss就越大。 &#xff08;2&#xff09;对比…

Vue2 - 数据响应式原理

目录 1&#xff0c;总览2&#xff0c;Observer3&#xff0c;Dep4&#xff0c;Watcher5&#xff0c;Schedule 1&#xff0c;总览 vue2官网参考 简单介绍下上图流程&#xff1a;以 Data 为中心来说&#xff0c; Vue 会将传递给 Vue 实例的 data 选项&#xff08;普通 js 对象&a…

SSM养老院综合服务系统----计算机毕业设计

项目介绍 该项目为后台管理项目&#xff0c;分为管理员与护工两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,个人资料密码管理,用户管理,床位类型管理,床位管理,护工管理,老人管理,咨询登记管理,预约登记管理,老人健康信息管理,费用管理等功能。 护…

【LeetCode每日一题】2487. 从链表中移除节点(调用栈+递归+翻转链表)

2024-1-3 文章目录 [2487. 从链表中移除节点](https://leetcode.cn/problems/remove-nodes-from-linked-list/)方法一&#xff1a;调用栈方法二&#xff1a;递归方法三&#xff1a;翻转链表 2487. 从链表中移除节点 方法一&#xff1a;调用栈 1.将所有节点按顺序压入栈中 2.从…

浅谈接口自动化测试

昨晚在某个测试交流群&#xff0c;听了一个测试老司机分享接口自动化测试的内容&#xff0c;对接口自动化有了更深的一些认识&#xff0c;也为接下来公司的接口自动化实施&#xff0c;提供了更多的思路。 这篇博客&#xff0c;就说说功能测试到接口自动化的进阶&#xff0c;以及…

商品推荐系统+可视化+2种协同过滤推荐算法 Django框架 大数据毕业设计(附源码+论文)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

【论文笔记】An Extractive-and-Abstractive Framework for Source Code Summarization

An Extractive-and-Abstractive Framework for Source Code Summarization 1. Introduction2. Model2.1 Overview2.2 Training of EACS2.2.1 Part i : Training of Extractor2.2.2 Part ii : Training of Abstracter 3. Evaluation 1. Introduction 代码摘要可以细分为抽取式代…

眼镜店系统管理软件,眼镜店配镜视力检查顾客资料管理系统

一、软件程序问答 1、这个软件在配镜的时候可以开配镜处方吗&#xff0c;可以打印出来吗&#xff1f; 如上图&#xff0c;以 佳易王眼镜店配镜顾客信息管理系统为例说明&#xff1a; 点击软件中的 配镜处方按钮&#xff0c;填写配镜相关信息&#xff0c;即可打印&#xff0c;…

Spring系列学习六、深入Spring AOP——揭开代理的神秘面纱

深入Spring AOP——揭开代理的神秘面纱 一、动态代理的实现原理二、CGLIB字节码增强的实现原理三、结语 上一章节&#xff0c;我们体验了Spring AOP强大的能力的同时&#xff0c;是不是也想弄明白&#xff0c;它是怎么原理是什么呢&#xff1f;如果自己要做一个类似的框架&…

SQL Server注入之攻防技战法

那天下着很大的雨&#xff0c;母亲从城里走回来的时候&#xff0c;浑身就是一个泥人&#xff0c;那一刻我就知道我没有别的选择了 1.Mssql报错注入 0.判断数据库类型 1.爆当前用户名 2.爆版本 3.爆服务器名 4.判断数据库个数 5.获取全部数据库 语句只适合>2005 爆当前数据…

旧电脑搭建NAS

旧电脑可以搭建NAS吗&#xff1f; 可以&#xff01; 性能好吗&#xff1f; 完全没问题&#xff01; 简单吗&#xff1f; 轻松上手&#xff01; 怎吗搭建&#xff1f; 这里&#xff1a;用旧电脑搭建NAS在您的家庭中&#xff0c;通过将旧 PC 转变为NAS服务器&#xff0c;您…

Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息

场景 Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中&#xff1a; Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中-CSDN博客 Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作&#xff1a; Wi…

BLE Mesh蓝牙组网技术详细解析之Access Layer访问层(六)

目录 一、什么是BLE Mesh Access Layer访问层&#xff1f; 二、Access payload 2.1 Opcode 三、Access layer behavior 3.1 Access layer发送消息的流程 3.2 Access layer接收消息的流程 3.3 Unacknowledged and acknowledged messages 3.3.1 Unacknowledged message …

轻松上手:Postman Interceptor 插件使用指南

什么是 Postman&#xff1f; Postman 是一种用于测试和开发 API 的工具&#xff0c;让开发者可以轻松地构建、发送、调试 HTTP 请求&#xff0c;并检查响应结果。通过Postman&#xff0c;开发者可以在不编写代码的情况下快速测试 API 的正确性和可靠性。Postman 还支持协作和自…

ubuntu18.04安装MySQL

1.安装mysql服务器端 sudo apt-get -y install mysql-server&#xff08;18.04/20.04不会提示输入密码&#xff0c;默认是没有密码&#xff09; 2.安装mysql客户端 sudo apt-get -y install mysql-client3.安装mysql模块 sudo apt-get -y install libmysqlclient-dev4.验证是…

融资项目——全局统一日志说明

通过日志可以查看程序的运行信息和异常信息等&#xff0c;便于维护。日志级别分为TRACE、DEBUG、INFO、WARN、ERROR级别&#xff0c;越往后打印的日志信息越少&#xff0c;如ERROR 级别只会在程序运行出错时才会打印日志。可在application.properties中设置日志级别。 logging…